【发布时间】:2013-04-08 21:31:48
【问题描述】:
我想通过实例的属性创建一个 XML 文档。为此,我编写了两个扩展。
<Extension()>
Public Function ToXml(Of T)(ByVal source As T) As XmlDocument
Dim oXmlDocument As New XmlDocument
oXmlDocument.AppendChild(oXmlDocument.CreateXmlDeclaration("1.0", "utf-8", Nothing))
oXmlDocument.AppendChild(oXmlDocument.CreateElement(XmlConvert.EncodeName(source.GetType.ToString)))
For Each Item As System.Reflection.FieldInfo In source.GetType.GetFields
Dim oElement As XmlElement = oXmlDocument.CreateElement(Item.Name)
oElement.Attributes.Append(oXmlDocument.CreateAttribute("Value")).Value = Item.GetValue(Nothing).ToString
oXmlDocument.DocumentElement.AppendChild(oElement)
Next
Return oXmlDocument
End Function
<Extension()>
Public Function ToXml(Of T)(ByVal source As IEnumerable(Of T)) As XmlDocument
Dim oXmlDocument As New XmlDocument
oXmlDocument.AppendChild(oXmlDocument.CreateXmlDeclaration("1.0", "utf-8", Nothing))
oXmlDocument.AppendChild(oXmlDocument.CreateElement(XmlConvert.EncodeName(source.GetType.ToString)))
For Each Item As T In source
oXmlDocument.DocumentElement.AppendChild(oXmlDocument.ImportNode(Item.ToXml.DocumentElement, True))
Next
Return oXmlDocument
End Function
第二种方法应该适用于IEnumerable(Of T) 的类型,第一种适用于所有其他类型。如果我尝试使用 Button、String、Int32 或类似的实例,它可以正常工作。对于 List(Of T) 的实例,也将调用第一个方法。 IEnumerable(Of T) 的扩展似乎被忽略了,因为 T 的扩展范围更广。
是否有可能强制List(Of T) 使用IEnumerable(Of T) 的扩展名?
【问题讨论】:
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
标签: xml vb.net reflection types extension-methods