C#在运行时使用泛型创建对象

时间:2009-05-30 00:51:06

标签: c# generics runtime activator

在下面的例子中,我可以通过字符串动态创建一个对象;但是,我无法获得BASE类的公共方法。我无法将obj转换为BASE因为我不知道在设计时将使用什么泛型。在运行时这样做的任何建议都会很好。

项目A包含A类{T,J> :BASE {T,J>
项目B包含B类{T,J> :BASE {T,J>

项目C包含Class BASE {T,J>
          公共虚拟控制{T,J>项目

Project Windows Form
cmdGo_Click事件

string dll = textbox1.text // ex“ProjectA.dll”
string class = textbox2.text // ex“A`2 [enuT,enuJ]”
object obj = activator.createinstancefrom(dll,class)

3 个答案:

答案 0 :(得分:5)

此代码创建BASE< int,string>的实例:

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

答案 1 :(得分:1)

如果您不知道运行时使用的类型参数,那么您也不能使用依赖于这些类型的任何操作,因此......为什么不将{0}的非泛型基类创建为BASE包含所有不依赖于泛型参数的操作,然后您可以将obj置于该基本类型并使用它。

答案 2 :(得分:0)

运行时,等式的泛型部分无关紧要,因为编译器已经填补了通用实现的空白。我相信你可以使用反射来获得基类方法,比如下面这个例子,我希望这会有所帮助。

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