【问题标题】:Dynamic generation of generics动态生成泛型
【发布时间】:2017-04-24 23:05:44
【问题描述】:

我有这个:

Dictionary<Type, List<AbstractThing>> Things { get; set; } = 
    new Dictionary<Type, List<AbstractThing>();

我有大量具体的 AbstractThing 类。照原样,上述字典依赖于虚拟调度来运行,这增加了不必要的开销。

我想要这个:

Dictionary <Type, List<T>> Things, { get; set; } = new Dictionary<Type, List<T>>();

对于列表,我希望每个值都有不同的泛型。它避免了虚拟调度的开销。不过不确定如何解释。

Key-value pair #1 would be: typeof(ConcreteThing1), List<ConcreteThing1>()
Key-value pair #2 would be: typeof(ConcreteThing2), List<ConcreteThing2)()
Key-value pair #3 would be: typeof(ConcreteThing3), List<ConcreteThing3)()

And so on.

这可能吗?执行此操作的最简单的一次写入运行(便携)方式是什么?例如,将解决方案嵌入程序本身(可移植)的方式将优于 Visual Studio 2017 等 IDE 中的代码生成工具。

【问题讨论】:

  • 那行不通。它怎么知道ConcreteThing1ConcreteThing2?古老的格言通常很合适 - 如果您在编译时不知道您的类型,那么您(可能)使用泛型是错误的。
  • 另外 - 我看不出你问题顶部的代码是如何工作的。 rextester.com/JIQZX50776
  • 按原样,上面的字典依赖于虚拟调度来运行,这增加了不必要的开销。 你是否分析过你的应用程序并确定虚拟调度是你的主要瓶颈应用?如果没有,甚至不要浪费你的时间。您正在尝试制作一些非常简单、非常复杂的东西,最多只能在一段可能没有运行的代码中减少几毫秒,因为您的代码的其他部分正在减慢它的速度。

标签: c# generics amazon-ecs


【解决方案1】:

我并不是说这一定是个好主意,但您当然可以动态生成一个泛型类,甚至是这样的集合:

var gt = typeof(List<>).MakeGenericType(typeof(string));
var list = Activator.CreateInstance(gt);

现在listList&lt;string&gt;

但是,这样做的开销可能比您抱怨的虚拟调度开销更大。因此,除非您已经对您的应用程序进行了概要分析并真正确定虚拟调度是您应用程序的主要瓶颈,否则我什至不会担心。

【讨论】:

  • 虽然能够MakeGenericType 绝对正确,但我仍然认为这不会解决 OP 的问题。如果不从基类派生(例如:rextester.com/LUYL75126)并使用具有out 类型的接口,您就不能在同一个字典中拥有不同的T - 这对于 OP 来说又回到了原点,但更糟。跨度>
  • 动态运行时代码生成怎么样?可能吗?
猜你喜欢
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多