是否无法动态使用generics?

我需要在运行时创建一个使用generics的类的实例,比如class ,而不知道它们将具有的类型T,我想做类似的事情:

 public Dictionary GenerateLists(List types) { Dictionary lists = new Dictionary(); foreach (Type type in types) { lists.Add(type, new List()); /* this new List() doesn't work */ } return lists; } 

……但我不能。 我认为不可能在通用括号内的C#中写入一个类型变量。 还有另一种方法吗?

你不能这样做 – generics的主要是编译时类型安全 – 但你可以用reflection来做:

 public Dictionary GenerateLists(List types) { Dictionary lists = new Dictionary(); foreach (Type type in types) { Type genericList = typeof(List<>).MakeGenericType(type); lists.Add(type, Activator.CreateInstance(genericList)); } return lists; } 

根据您调用此方法的频率,使用Activator.CreateInstance可能会很慢。 另一种选择是做这样的事情:

private Dictionary> delegates = new Dictionary>();

  public Dictionary GenerateLists(List types) { Dictionary lists = new Dictionary(); foreach (Type type in types) { if (!delegates.ContainsKey(type)) delegates.Add(type, CreateListDelegate(type)); lists.Add(type, delegates[type]()); } return lists; } private Func CreateListDelegate(Type type) { MethodInfo createListMethod = GetType().GetMethod("CreateList"); MethodInfo genericCreateListMethod = createListMethod.MakeGenericMethod(type); return Delegate.CreateDelegate(typeof(Func), this, genericCreateListMethod) as Func; } public object CreateList() { return new List(); } 

在第一次命中时,它将创建一个创建列表的generics方法的委托,然后将其放入字典中。 在每次后续命中时,您只需调用该类型的委托。

希望这可以帮助!