2008-12-22 43 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