C# 泛型的动态生成

C# 泛型的动态生成,c#,generics,amazon-ecs,C#,Generics,Amazon Ecs,我有这个: Dictionary<Type, List<AbstractThing>> Things { get; set; } = new Dictionary<Type, List<AbstractThing>(); Dictionary Things{get;set;}= new Dictionary我并不是说这一定是个好主意,但您当然可以动态生成泛型类,甚至是具有以下内容的集合: var gt = typeof(List<>

我有这个:

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

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

var gt = typeof(List<>).MakeGenericType(typeof(string));
var list = Activator.CreateInstance(gt);
var gt=typeof(List).MakeGenericType(typeof(string));
var list=Activator.CreateInstance(gt);
现在
列表
是一个
列表


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

这是行不通的。它怎么知道
ConcreteThing1
ConcreteThing2
?这句古老的格言通常适用——如果你在编译时不知道自己的类型,那么你(可能)使用泛型是错误的。而且——我看不出你问题顶部的代码是如何工作的。如上所述,字典依赖于虚拟分派来运行,这增加了不必要的开销。您是否分析了您的应用程序,并将虚拟调度确定为应用程序中的一个主要瓶颈?如果没有,甚至不要在上面浪费时间。您正试图使一些非常简单、非常复杂的代码在大部分时间内可能不会运行,因为您的代码的其他部分正在减慢它的运行速度。虽然能够
MakeGenericType
这是绝对正确的,但我仍然认为这不会解决OP的问题。如果不从基类(例如:)派生并使用带有
out
类型的接口,那么在同一个字典中不能有不同的
T
,这对于OP来说是回到了原点,但更糟。那么动态运行时代码生成呢?可能的
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.
var gt = typeof(List<>).MakeGenericType(typeof(string));
var list = Activator.CreateInstance(gt);