通用类& Type.GetType()

时间:2010-09-24 14:49:19

标签: c# asp.net generics types

有点奇怪,我有一个通用类

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");

任何想法????

4 个答案:

答案 0 :(得分:15)

这样的事情:

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<T>调用方法,因为您不知道T ...但您可以使用某些方法定义非泛型基类或接口,其中不需要T,并转换为该类。或者你可以通过反射调用它上面的方法。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

使用反射创建新对象:

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

答案 3 :(得分:0)

你必须通过反思来构建类。

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/b8ytshk6.aspx