有点奇怪,我有一个通用类
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");
任何想法????
答案 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。