Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可以在运行时使用C实例化模板类吗#_C#_Templates_Generics_Runtime - Fatal编程技术网

C# 可以在运行时使用C实例化模板类吗#

C# 可以在运行时使用C实例化模板类吗#,c#,templates,generics,runtime,C#,Templates,Generics,Runtime,是否可以在运行时实例化模板类,例如: Type type = Type.GetType("iTry.Workflow.Person"); WorkflowPropertyViewModel<type> propViewModel = new WorkflowPropertyViewModel<type>(); Type Type=Type.GetType(“iTry.Workflow.Person”); WorkflowPropertyViewModel propVie

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

Type type = Type.GetType("iTry.Workflow.Person");
WorkflowPropertyViewModel<type> propViewModel = new WorkflowPropertyViewModel<type>();
Type Type=Type.GetType(“iTry.Workflow.Person”);
WorkflowPropertyViewModel propViewModel=新的WorkflowPropertyViewModel();
这显然是行不通的。还有别的办法吗

泛型类如下所示:

public class WorkflowPropertyViewModel<T> : IProperty<T>  
{
    public Task<T> ValueAsync
    {
        get;
        set;
    }

    public T Value
    {
        get;
        set;
    }

    public IQueryable<T> PossibleItems
    {
        get;
        set;
    }
}
公共类WorkflowPropertyViewModel:IProperty
{
公共任务值异步
{
得到;
设置
}
公共价值
{
得到;
设置
}
公共可查询的可能项
{
得到;
设置
}
}

您可以在给定类型对象的情况下创建任何类型的对象:

object o = Activator.CreateInstance(type);
这假定该类型具有默认构造函数。还有其他用于传递构造函数参数的Activator方法:

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

总而言之,它看起来像:

var type = Type.GetType("iTry.Workflow.Person");
var genericType = typeof(WorkflowPropertyViewModel<>).MakeGenericType(type);
var o = Activator.CreateInstance(genericType);
var type=type.GetType(“iTry.Workflow.Person”);
var genericType=typeof(WorkflowPropertyViewModel)。MakeGenericType(type);
var o=Activator.CreateInstance(genericType);
试试这个:

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

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

是的,您可以使用仅在运行时已知的类型实例化泛型类,例如:

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());
}
公共类A{}
公共U类{
公共tx{get;set;}
}
静态void Main(字符串[]参数){
a型=a型;
类型u=类型(u);
动态uOfA=Activator.CreateInstance(u.MakeGenericType(a));
uOfA.X=新A();
Console.WriteLine(uOfA.GetType());
Console.WriteLine(uOfA.X.GetType());
}

但是,此代码段使用了反射和动态类型,这两种类型都可能导致许多维护问题,因此您最好非常小心地使用它们或找到一个更简单的解决方案。

有趣的问题是:如何获取
类型
?你应该和一个例子一起回答这个问题,以及如何在runtime@tillerstarr:这就是
MakeGenericType
的用途。顺便说一句:这是“通用”而不是“模板”。谢谢这为我工作。动力似乎是完成工作的动力。