我有一个带有此签名的子
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(用户组)
答案 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实例并执行偶尔的类型转换会更好。
对于您来说情况可能并非如此(例如,如果通用类来自您无法控制的外部库,或者这种使用是一次性的),但值得退一步并采取看。