2009-05-30 44 views
0

在以下示例中,我可以通過字符串動態創建對象;但是,我沒有辦法獲得BASE類的公共方法。我不能將obj投射到BASE,因爲我不知道在設計時會使用什麼通用屬性。在運行時這樣做的任何建議都會很好。C#在運行時使用泛型創建對象

項目A包含一類【T,J>:BASE【T,J>
項目B包含B類【T,J>:BASE【T,J>

項目C包含類BASE { T,J>時
公共虛擬控制【T,J>項

項目Windows窗體
cmdGo_Click事件

串DLL = textbox1.text // EX 「ProjectA.dll」
字符串類= TextBox2中//的.text前 「A`2 [enuT,enuJ]」
obj對象= activator.createinstancefrom(DLL,類)

回答

0

運行時等式的泛型部分並不重要,因爲編譯器已經填補了通用實現的空白。我相信你可以使用反射來獲得基類的方法,就像下面這個例子,我希望這有助於。

MethodInfo[] baseMethods = obj.GetType().BaseType.GetMethods(); 
object retObj = baseMethods[0].Invoke(obj, new object[] {"paramVal1", 3, "paramVal3"}); 
1

如果你不知道在運行時所使用的類型參數,那麼你就不能使用任何依賴於這些類型的操作,所以......爲什麼不把一個非泛型基類生成爲BASE,其中包含所有不依賴於通用參數的操作,那麼你可以將obj設置爲該基類型並使用它。

+0

我知道在運行時的參數,因爲它們是在文本框中A`2 [enuT,enuJ]表示。不幸的是我的公共控制{T,J>是必須的。我想我可能會走運。感謝您的幫助 – alpha 2009-05-30 01:10:08

5

此代碼創建BASE <整型,字符串>的一個實例:

Type type = typeof(BASE<,>).MakeGenericType(typeof(int), typeof(string)); 
object instance = Activator.CreateInstance(type); 
+0

問題在於您知道設計時的泛型(typeof(int),typeof(string),我沒有那種奢侈。 – alpha 2009-05-30 01:12:27