在下面的例子中,我可以通过字符串动态创建一个对象;但是,我无法获得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)
答案 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"});