Расширение 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
учебный класс.