2009-05-30 72 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