This question already has answers here:
Pass An Instantiated System.Type as a Type Parameter for a Generic Class
(6个答案)
5年前关闭。
在C#中,我有以下对象:
我想使用C#反射(Activator.CreateInstance)动态创建TaskA或TaskB。但是,我事先不知道类型,所以我需要基于“ namespace.TaskA”或“ namespace.TaskAB”之类的字符串动态创建TaskA。
根据您的修改:对于这种情况,您可以执行此操作...
若要查看通用类名的backtick1来源,请参见this article。
注意:如果泛型类接受多种类型,则在省略类型名称时必须包含逗号,例如:
(6个答案)
5年前关闭。
在C#中,我有以下对象:
public class Item
{ }
public class Task<T>
{ }
public class TaskA<T> : Task<T>
{ }
public class TaskB<T> : Task<T>
{ }
我想使用C#反射(Activator.CreateInstance)动态创建TaskA或TaskB。但是,我事先不知道类型,所以我需要基于“ namespace.TaskA”或“ namespace.TaskAB”之类的字符串动态创建TaskA。
最佳答案
检查此article和此simple example。快速将其翻译成您的班级...
var d1 = typeof(Task<>);
Type[] typeArgs = { typeof(Item) };
var makeme = d1.MakeGenericType(typeArgs);
object o = Activator.CreateInstance(makeme);
根据您的修改:对于这种情况,您可以执行此操作...
var d1 = Type.GetType("GenericTest.TaskA`1"); // GenericTest was my namespace, add yours
Type[] typeArgs = { typeof(Item) };
var makeme = d1.MakeGenericType(typeArgs);
object o = Activator.CreateInstance(makeme);
若要查看通用类名的backtick1来源,请参见this article。
注意:如果泛型类接受多种类型,则在省略类型名称时必须包含逗号,例如:
Type type = typeof(IReadOnlyDictionary<,>);
10-08 13:08