我希望能够使用包含类型作为属性的类中的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提案的不同之处在于,这与创建对象的新实例相关,而另一个答案是关于生成泛型方法。在使用动态创建的新实例回答此问题后,重复的提案实际上很有用。
任何帮助将不胜感激
答案 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