是否无法动态使用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
在第一次命中时,它将创建一个创建列表的generics方法的委托,然后将其放入字典中。 在每次后续命中时,您只需调用该类型的委托。
希望这可以帮助!