1

我不确定如何描述这一点,但我正在尝试创建一个包含名为 FromXml 的共享(工厂)函数的基类。我希望此函数实例化正确类型的对象,然后通过 XmlDocument 填充它。

例如,假设我有这样的事情:

Public Class XmlObject
    Public Shared Function FromXml(ByVal source as XmlDocument) As XmlObject
        // <need code to create SPECIFIC TYPE of object and return it
    End Function
End Class

Public Class CustomObject
    Inherits XmlObject
End Class

我希望能够做这样的事情:

Dim myObject As CustomObject = CustomObject.FromXml(source)

这可能吗?

4

2 回答 2

1

首先,FromXml 函数必须知道它需要创建和返回的对象类型。为此,您可以:

将类型本身作为参数传递:

Public Shared Function FromXml(ByVal source As XmlDocument, _
                               ByVal resultType As Type) As XmlObject
End Function

使用泛型:

Public Shared Function FromXml(Of T)(ByVal source As XmlDocument) As XmlObject

End Function

(使用泛型,您还可以指定,例如,“Of T as XmlObject”,以仅在 T 中接收可分配给 XmlObject 的类)。

接下来,您必须决定如何实例化传递类型的新对象。您可以调查传递的确切类型并相应地创建一个新实例(硬编码),或者使用反射来调用传递类型的构造函数方法(假设它有一个可访问的构造函数)(参见此处的示例)。这可能有点棘手,因为如果 T 没有空构造函数,那么您将不得不调查构造函数的参数并调用 matchin 委托(同样,使用反射)。

于 2010-03-19T14:55:02.233 回答
0

如果你想告诉一个函数对特定类型做某事,只需向它添加泛型参数。不确定这是否是实现您最初意图的最佳方式,但它会完成工作。

   Public Class XmlObject
      Public Shared Function FromXml(Of T)(ByVal source As XmlDocument) As T
         Dim result As T = Activator.CreateInstance(GetType(T))

         Return result
      End Function
   End Class
于 2010-03-19T14:48:42.450 回答