如何从对象类型属性设置方法的T?

时间:2018-05-06 18:18:59

标签: c# asp.net-core-2.0 system.reflection

我希望能够使用包含类型作为属性的类中的T类型变量。我该如何动态地做到这一点?

我有这种类型:

public class Mapper 
{
    public string Key {get; set;}
    public Type RequestType {get; set;}
    public Type ResponseType {get; set;}

    public Mapper(string key) 
    {
        RequestType = typeof(SomeType);
        ResponseType = typeof(SomeType2);
    }
}

我得到了这门课程

public class Handler<T> where T: new () 
{
  // some properties and methods
}

我希望做到以下几点:

var mapper = new Mapper("Key1");
Hanadler<mapper.RequestType> handler = new Handler<mapper.RequestType>();

我总能得到的问题是:

'mapper' is a variable but is used like a type

我试图在整个网络上寻找这样的例子,但我甚至不确定如何描述这个。

请注意它与Duplicate提案的不同之处在于,这与创建对象的新实例相关,而另一个答案是关于生成泛型方法。在使用动态创建的新实例回答此问题后,重复的提案实际上很有用。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

因为你必须使用Type in generic position,你必须在编译时确定你的目标类型;

Hanadler<TargetType> handler = new Handler<TargetType>();

如果要在运行系统中确定目标泛型类型,则必须使用反射。 在你的情况下:

var d1 = typeof(Handler<>);
Type[] typeArgs = { mapper.RequestType };
var makeme = d1.MakeGenericType(typeArgs);
object o = Activator.CreateInstance(makeme);

您可以在此处查看MSDN文档:
https://msdn.microsoft.com/en-us/library/system.type.makegenerictype(v=vs.110).aspx