2008-12-22 69 views
2

我有一个子与此签名如何动态创建泛型类的对象?

Public Sub Save(ByVal obj As IPta) 

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

我该怎么做? 我已经找到一个C#示例 Declare a generic type instance dynamically

但我不明白如何实现这个在我的情况。

TIA

CNC中

到clearify

让假装obj是Address类型的对象(地址从PTA继承所以它实现IPTA)

现在我想创建一个新的PtaDao对象,它以Address对象为例

Dim AddressDao as New Generic.PtaDao(of Address) 

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

回答

4

使它成为一个通用的方法,采取类型参数的实例作为一个参数,并限制类型参数有一个公共的无参数的构造函数,并实施IPTA:

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

thx that works :) – 2008-12-22 14:09:00

1

如果您有机会获得保存方法的来源,使它通用:

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 
1

这不是一个答案,但只是一些广告...

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

结果运行缓慢,看起来难以维护。我最终意识到将整个事物传递给Object实例并执行偶尔的类型转换会更好。

这可能不适用于您(例如,如果泛型类来自您无法控制的外部库,或者这种使用是一次性的),但值得站出来并考虑看看。

+0

+1。反射速度很慢,并且在运行时从通用类型创建新的具体类型更是如此。如果可以的话,避免它。 – 2008-12-22 14:09:49