5

是否可以在运行时实例化模板类,例如:

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;
    }
}
4

3 回答 3

6

给定 Type 对象,您可以创建任何类型的对象:

object o = Activator.CreateInstance(type);

这假定该类型具有默认构造函数。传递构造函数参数还有其他 Activator 方法:

http://msdn.microsoft.com/en-us/library/wccyzw83.aspx

为了获得特定的泛型类型,您可以在泛型类型定义上调用 MakeGenericType

http://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);
于 2012-11-22T12:39:30.930 回答
2

试试这个:

object o = Activator.CreateInstance(typeof(WorkflowPropertyViewModel<>).MakeGenericType(new Type[] {type}));

请注意,在代码中您不能轻易引用该类型,除非它实现了另一个非泛型接口 - 因此您必须使用 object 代替或使用更多反射。

于 2012-11-22T12:42:50.237 回答
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());
}

但是,此代码段使用反射和动态类型,这两者都可能导致很多维护问题,因此您最好谨慎使用它们或找到更简单的解决方案。

于 2012-11-22T12:45:13.200 回答