是否可以在运行时实例化模板类,例如:
Type type = Type.GetType("iTry.Workflow.Person");
WorkflowPropertyViewModel<type> propViewModel = new WorkflowPropertyViewModel<type>();
这显然不起作用。还有其他方法吗?
Generic类如下所示:
public class WorkflowPropertyViewModel<T> : IProperty<T>
{
public Task<T> ValueAsync
{
get;
set;
}
public T Value
{
get;
set;
}
public IQueryable<T> PossibleItems
{
get;
set;
}
}
答案 0 :(得分:6)
您可以在给定Type对象的情况下创建任何类型的对象:
object o = Activator.CreateInstance(type);
这假定类型具有默认构造函数。还有其他Activator方法用于传递构造函数参数:
http://msdn.microsoft.com/en-us/library/wccyzw83.aspx
为了获得特定的泛型类型,您可以在泛型类型定义
上调用MakeGenericTypehttp://msdn.microsoft.com/en-us/library/system.type.makegenerictype.aspx
所以完全把它看起来像是:
var type = Type.GetType("iTry.Workflow.Person");
var genericType = typeof(WorkflowPropertyViewModel<>).MakeGenericType(type);
var o = Activator.CreateInstance(genericType);
答案 1 :(得分:2)
试试这个:
object o = Activator.CreateInstance(typeof(WorkflowPropertyViewModel<>).MakeGenericType(new Type[] {type}));
请注意,在代码中,您无法轻松引用该类型,除非它实现了另一个非泛型接口 - 因此您必须使用对象或使用更多反射。
答案 2 :(得分:2)
是的,您可以使用仅在运行时知道的类型来实例化泛型类,例如:
public class A { }
public class U<T> {
public T X { get; set; }
}
static void Main(string[] args) {
Type a = typeof(A);
Type u = typeof(U<>);
dynamic uOfA = Activator.CreateInstance(u.MakeGenericType(a));
uOfA.X = new A();
Console.WriteLine(uOfA.GetType());
Console.WriteLine(uOfA.X.GetType());
}
但是,此代码段使用反射和动态类型,这两种情况都可能导致许多维护问题,因此您最好小心使用它们或找到更简单的解决方案。