C#学习教程:是否无法动态使用generics?分享


是否无法动态使用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方法的委托,然后将其放入字典中。 在每次后续命中时,您只需调用该类型的委托。

希望这可以帮助!

上述就是C#学习教程:是否无法动态使用generics?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/960032.html

发表评论

邮箱地址不会被公开。 必填项已用*标注