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

C#在运行时使用泛型创建对象,c#,generics,runtime,activator,C#,Generics,Runtime,Activator,在下面的示例中,我可以通过字符串动态创建对象;然而,我没有办法获得基类的公共方法。我无法将obj强制转换为基础,因为我不知道在设计时将使用什么泛型。任何关于在运行时这样做的建议都很好 项目A包含类A{T,J>:基{T,J> 项目B包含类B{T,J>:基{T,J> 项目C包含基类{T,J> 公共虚拟控件{T,J>项 项目窗口窗体 cmdGo_单击事件 string dll=textbox1.text//ex“ProjectA.dll” string class=textbox2.text//ex“

在下面的示例中,我可以通过字符串动态创建对象;然而,我没有办法获得基类的公共方法。我无法将obj强制转换为基础,因为我不知道在设计时将使用什么泛型。任何关于在运行时这样做的建议都很好

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

项目C包含基类{T,J>
公共虚拟控件{T,J>项

项目窗口窗体
cmdGo_单击事件

string dll=textbox1.text//ex“ProjectA.dll”
string class=textbox2.text//ex“A`2[enuT,enuJ]”

object obj=activator.createinstancefrom(dll,类)如果您不知道运行时使用的类型参数,那么您也不能使用依赖于这些类型的任何操作,因此…为什么不为
base
创建一个非泛型基类,其中包含所有不依赖于泛型参数的操作,然后您可以将
obj
装箱到该基类并使用它。

如果您不知道在运行时使用的类型参数,那么您也不能使用任何依赖于这些类型的操作,因此…为什么不为
base
创建一个非泛型基类,其中包含所有不依赖于泛型参数的操作,然后您可以将
obj
装箱到该基类并使用它。

ime等式的泛型部分并不重要,因为编译器已经填补了泛型实现的空白。我相信您可以使用反射来获取基类方法,如下面的示例中所示,我希望这会有所帮助

MethodInfo[] baseMethods = obj.GetType().BaseType.GetMethods();
object retObj = baseMethods[0].Invoke(obj, new object[] {"paramVal1", 3, "paramVal3"});
在运行时,等式的泛型部分并不重要,因为编译器已经填补了泛型实现的空白。我相信您可以使用反射来获取基类方法,如下面的示例中所示,我希望这会有所帮助

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

此代码创建一个BASE的实例:

Type Type=typeof(BASE).MakeGenericType(typeof(int),typeof(string));
对象实例=Activator.CreateInstance(类型);

此代码创建一个BASE的实例:

Type Type=typeof(BASE).MakeGenericType(typeof(int),typeof(string));
对象实例=Activator.CreateInstance(类型);

我知道运行时的参数,因为它们在文本框A`2[enuT,enuJ]中有说明。不幸的是,我的公共控件{T,J>是必须的。我想我可能运气不好。谢谢你的帮助,我知道运行时的参数,因为它们在文本框A`2[enuT,enuJ]中有说明。不幸的是,我的公共控件{T,J>是必须的。我想我可能运气不好。谢谢你的帮助。问题是你知道设计时的泛型(typeof(int),typeof(string),我没有那种奢侈。问题是你知道设计时的泛型(typeof(int),typeof(string),我没有那种奢侈。