Расширение SyndicationItem в VB.net

Мне нужна твоя помощь по вопросу о наследовании. В моем проекте я использую класс.net SyndicationFeed для чтения нескольких каналов и создания его элементов. Для каждого элемента я также хочу показать изображение канала, поэтому я хотел назначить одно и то же свойство ImageUrl канала. Итак, я начал с создания производного класса:

Public Class SyndicationItemWImage
 Inherits SyndicationItem
 Private mItemImage As Uri

 Public Property ItemImage As Uri
  Get
   Return mItemImage
  End Get
  Set(value As Uri)
   mItemImage = value
  End Set
  End Property
End Class

Затем я бы инициализировал объект и заполнил его

Dim BlogsPostsWImage As List(Of SyndicationItemWImage)
BlogsPostsWImage = New List(Of SyndicationItemWImage)
…
[initialize SyndFeed]
…
BlogsPostsWImage.AddRange(SyndFeed.Items.ToList.GetRange(0, 10))

Где SynFeed - это хорошо работающий объект SyndicationFeed. К сожалению, я получаю ошибку, что приведение неверно:

System.InvalidCastException: невозможно преобразовать объект типа 'System.Collections.Generic.List 1[System.ServiceModel.Syndication.SyndicationItem]' to type 'System.Collections.Generic.IEnumerable 1 [lucamauricom.SyndicationItemWImage]". at lucamauricom._default.Page_Load(Отправитель объекта, EventArgs e)

Я не понимаю, почему: нельзя ли приводить из родительского класса в дочерний класс? Я думаю, что я упускаю что-то фундаментальное здесь... не уверен, что.

Спасибо за любую помощь, которую вы можете предоставить.

1 ответ

Решение

К сожалению, никто не может мне помочь с этим, поэтому я продолжал атаковать проблему под другим углом: у меня теперь есть альтернативный метод для достижения той же цели. Я отвечаю на свой вопрос здесь, чтобы задокументировать это.

Начиная с того же SynFeed, что и выше, я заполнил временный список, а затем добавил ElementExtension:

Dim TempItems As New List(Of SyndicationItem)

If SyndFeed.Items.Count >= CurrentFeed.TotalElements Then
  TempItems.AddRange(SyndFeed.Items.ToList.GetRange(0, CurrentFeed.TotalElements))
Else
  TempItems.AddRange(SyndFeed.Items.ToList)
 End If

 For Each CurrItem As SyndicationItem In TempItems
   CurrItem.ElementExtensions.Add("favico", "", SingleFeed.Descendants("//bits.wikimedia.org/favicon/wikipedia.ico")
 Next

 FeedItems.AddRange(TempItems)

ElementExtension называется favico, он не содержит пространства имен и имеет значение //bits.wikimedia.org/favicon/wikipedia.ico, Таким образом, я добавил данные в виде своего рода "настраиваемого поля", которое можно легко прочитать на странице ASPX, например:

<img src='<%#CType(Container.DataItem, SyndicationItem).ElementExtensions.ReadElementExtensions(Of String)("favico", "").Item(0).ToString%>' height="16" />

Я до сих пор не могу понять, что не так с производным классом моей первоначальной идеи, но этот второй способ решения проблемы, вероятно, лучше в контексте Syndication учебный класс.

Другие вопросы по тегам