0

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

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

项目 C 包含 Class BASE{T,J>
public virtual control{T,J> item

项目 Windows 窗体
cmdGo_Click 事件

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

4

3 回答 3

5

这段代码创建了一个 BASE<int, string> 的实例:

Type type = typeof(BASE<,>).MakeGenericType(typeof(int), typeof(string));
object instance = Activator.CreateInstance(type);
于 2009-05-30T01:09:02.440 回答
1

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

于 2009-05-30T01:01:31.130 回答
0

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

MethodInfo[] baseMethods = obj.GetType().BaseType.GetMethods();
object retObj = baseMethods[0].Invoke(obj, new object[] {"paramVal1", 3, "paramVal3"});
于 2009-05-30T01:02:40.847 回答