【问题标题】:Generic Class & Type.GetType()泛型类 & Type.GetType()
【发布时间】:2011-04-16 20:05:55
【问题描述】:

有点困惑,我有一个通用类

public abstract class MyClass<T> : UserControl
{

}

我有一个这样的类型

Type type = Type.GetType("Type From DB as String", true, true);

我想使用类型创建 MyClass 的实例......但这不起作用。

MyClass<type> control = (MyClass<type>)LoadControl("/UsercControl.ascx");

有什么想法吗???

【问题讨论】:

  • 我会使用 IoC。代码是否处于紧密循环中?

标签: c# asp.net generics types


【解决方案1】:

您使用反射创建新对象:

type.GetConstructor(new Type[]{}).Invoke(new object[]{});

【讨论】:

    【解决方案2】:

    你必须通过反射构造类。

    更多详情请见http://msdn.microsoft.com/en-us/library/b8ytshk6.aspx

    【讨论】:

    • 泛型类型在编译时解析,无法使用反射解析
    【解决方案3】:

    反射中的泛型比这复杂一点。您正在寻找的是 GetGenericTypeDefinition() 和 MakeGenericType() 方法。获取您的泛型类型(您可以通过在实例上调用 GetType() 或使用 typeof(MyClass&lt;Object&gt;) 来获取它),然后调用 GetGenericTypeDefinition() 来获取基本的开放泛型类型 (MyClass&lt;T&gt;)。然后,在该类型上,调用 MakeGenericType() 并将一个包含一个元素的数组传递给它;要用于关闭泛型的类型。这将为您提供一个使用动态发现的类型 (MyClass&lt;MyType&gt;) 关闭的泛型类型,您可以将其传递给 Activator.CreateInstance()。

    【讨论】:

      【解决方案4】:

      类似这样的:

      Type typeArgument = Type.GetType("Type From DB as String", true, true);
      Type template = typeof(MyClass<>);
      Type genericType = template.MakeGenericType(typeArgument);
      object instance = Activator.CreateInstance(genericType);
      

      现在您将无法使用它作为 MyClass&lt;T&gt; 调用方法,因为您不知道 T... 但您可以定义具有某些不需要T 的方法的非泛型基类或接口,并强制转换为该方法。或者你可以通过反射调用它的方法。

      【讨论】:

      • 我打算发布类似的代码,但我不确定您将如何使用结果。你受制于反思吗? (啊,你添加了更多文字来证实我的想法。)
      • 您当然可以将它用作 MyClass,因为您知道 T。查看类型的名称,您会发现它是通用类名称和参数的混搭类型。但是,我不认为 typeof(MyClass) 是合法的;您必须指定一个类型闭包,然后使用 GetGenericTypeDefinition 将其剥离)
      • @KeighS,Jon 的代码 (typeof(MyClass&lt;&gt;)) 确实有效。自己测试一下。
      • @KeithS:您在编译时并不知道,因此您不能声明该类型的变量或将instance 转换为该类型。但是,typeof(MyClass&lt;&gt;) 绝对合法的。
      • 第 3 行有错字。应该是 template.MakeGenericType
      猜你喜欢
      • 2012-08-27
      • 1970-01-01
      • 2012-07-02
      • 2019-05-30
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多