【问题标题】:C# Create objects with Generics at runtimeC# 在运行时使用泛型创建对象
【发布时间】:2009-05-30 09:44:24
【问题描述】:

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

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

项目 C 包含类 BASE{T,J>
公共虚拟控件{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)

【问题讨论】:

    标签: c# generics runtime activator


    【解决方案1】:

    这段代码创建了一个 BASE 的实例:

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

    【讨论】:

    • 问题是你在设计时就知道泛型(typeof(int), typeof(string),我没有那么奢侈。
    【解决方案2】:

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

    【讨论】:

    • 我知道运行时的参数,因为它们在文本框 A`2[enuT,enuJ] 中说明。不幸的是,我的公共控制{T,J> 是必须的。我想我可能不走运。感谢您的帮助
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多