在 VB.net 中扩展 SyndicationItem
Extending SyndicationItem in VB.net
我需要你的帮助来解决关于继承的问题。
在我的一个项目中,我正在使用 SyndicationFeed .net class 来读取多个提要,使其元素成为 ul。
对于每个元素,我也想显示提要的图像,因此我想将提要的相同 ImageUrl 属性 分配给单个项目。
所以我开始创建一个派生的 class:
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
然后我会初始化 object 并填充它
Dim BlogsPostsWImage As List(Of SyndicationItemWImage)
BlogsPostsWImage = New List(Of SyndicationItemWImage)
…
[initialize SyndFeed]
…
BlogsPostsWImage.AddRange(SyndFeed.Items.ToList.GetRange(0, 10))
其中 SynFeed 运行良好 SyndicationFeed object。
不幸的是,我收到一个错误消息,指出演员表无效:
System.InvalidCastException: Unable to cast object of type 'System.Collections.Generic.List1[System.ServiceModel.Syndication.SyndicationItem]' to type 'System.Collections.Generic.IEnumerable
1[lucamauricom.SyndicationItemWImage]'. at lucamauricom._default.Page_Load(Object sender, EventArgs e)
我不明白为什么:难道不应该允许从 parent class 转换为 child 吗?
我想我在这里遗漏了一些基本的东西……不确定是什么。
感谢您提供的任何帮助。
不幸的是,似乎没有人能帮我解决这个问题,所以我继续从另一个角度解决这个问题:我现在有了另一种方法来实现同样的目标。我在这里回答我自己的问题来记录它。
从与上面相同的 SynFeed 开始,我填充了一个临时 List 然后我添加了一个 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
。
这样,我将数据添加为一种 "custom field" 形式,可以像这样在 ASPX 页面上轻松读取:
<img src='<%#CType(Container.DataItem, SyndicationItem).ElementExtensions.ReadElementExtensions(Of String)("favico", "").Item(0).ToString%>' height="16" />
我仍然无法弄清楚我最初想法的派生 class 有什么问题,但是在 Syndication
[=32] 的上下文中,第二种处理问题的方法可能更好=].
我需要你的帮助来解决关于继承的问题。 在我的一个项目中,我正在使用 SyndicationFeed .net class 来读取多个提要,使其元素成为 ul。 对于每个元素,我也想显示提要的图像,因此我想将提要的相同 ImageUrl 属性 分配给单个项目。 所以我开始创建一个派生的 class:
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
然后我会初始化 object 并填充它
Dim BlogsPostsWImage As List(Of SyndicationItemWImage)
BlogsPostsWImage = New List(Of SyndicationItemWImage)
…
[initialize SyndFeed]
…
BlogsPostsWImage.AddRange(SyndFeed.Items.ToList.GetRange(0, 10))
其中 SynFeed 运行良好 SyndicationFeed object。 不幸的是,我收到一个错误消息,指出演员表无效:
System.InvalidCastException: Unable to cast object of type 'System.Collections.Generic.List
1[System.ServiceModel.Syndication.SyndicationItem]' to type 'System.Collections.Generic.IEnumerable
1[lucamauricom.SyndicationItemWImage]'. at lucamauricom._default.Page_Load(Object sender, EventArgs e)
我不明白为什么:难道不应该允许从 parent class 转换为 child 吗? 我想我在这里遗漏了一些基本的东西……不确定是什么。
感谢您提供的任何帮助。
不幸的是,似乎没有人能帮我解决这个问题,所以我继续从另一个角度解决这个问题:我现在有了另一种方法来实现同样的目标。我在这里回答我自己的问题来记录它。
从与上面相同的 SynFeed 开始,我填充了一个临时 List 然后我添加了一个 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
。
这样,我将数据添加为一种 "custom field" 形式,可以像这样在 ASPX 页面上轻松读取:
<img src='<%#CType(Container.DataItem, SyndicationItem).ElementExtensions.ReadElementExtensions(Of String)("favico", "").Item(0).ToString%>' height="16" />
我仍然无法弄清楚我最初想法的派生 class 有什么问题,但是在 Syndication
[=32] 的上下文中,第二种处理问题的方法可能更好=].