如何动态创建泛型类的对象?

时间:2008-12-22 12:44:59

标签: .net vb.net generics

我有一个带有此签名的子

Public Sub Save(ByVal obj As IPta)

现在我希望创建一个Generic.PtaDao(T)的实例,其类型为obj,它可以是从我的基类Pta继承的任何东西

我该怎么做? 我已经找到了一个c#的例子 Declare a generic type instance dynamically

但我不明白如何在我的情况下实现这一点。

TIA

-edit -

清除

让假装obj是Address类型的对象(Address继承自Pta,因此它实现了IPta)

现在我想创建一个新的PtaDao对象,它接受Address对象,例如

Dim AddressDao as New Generic.PtaDao(of Address)

但我想动态地这样做,所以如果obj是UserGroup类型,它应该创建 PtaDao(用户组)

3 个答案:

答案 0 :(得分:4)

使其成为通用方法,将type参数的实例作为参数之一,并将type参数约束为具有公共无参数构造函数并实现IPta:

Public Sub Save(Of T As { IPta, New })(ByVal obj As T)
    Dim foo As New T
    ' Do more stuff here
End Sub

答案 1 :(得分:1)

如果您有权访问Save方法的来源,请将其设为通用:

Public Sub Save(Of TSomeIPtaType As {IPta, New})(ByVal obj As TSomeIPtaType)
    Dim dao As New Generic.PtaDAO(Of TSomeIPtaType)
End Sub

Public Sub ExampleUsage()

    Dim address As New Address

    Save(address)

End Sub

答案 2 :(得分:1)

这不是答案,只是一些建议......

仔细看看你为什么要这样做。我一直处于类似的情况,我使用大量的反射来创建泛型对象,并使用直到运行时才知道的类型来调用泛型方法。

结果是运行缓慢而且难以查看维护。我最终意识到,让整个事件只是传递Object实例并执行偶尔的类型转换会更好。

对于您来说情况可能并非如此(例如,如果通用类来自您无法控制的外部库,或者这种使用是一次性的),但值得退一步并采取看。