如何使用Reflection Emit定义具有相同名称和不同类型参数的多个类型?

Wes*_*ser 5 .net c# generics reflection.emit

如何使用System.Reflection.Emit库生成类似这样的类型:

public class Test<T> {}
public class Test<T1, T2> {}
Run Code Online (Sandbox Code Playgroud)

当我使用第二个类型声明调用ModuleBuilder.DefineType(string)时,我得到一个异常,因为模块中已经存在另一个具有相同名称的类型(我已经在第一个类型上定义了类型参数).有任何想法吗?

Jar*_*Par 3

您应该像 C# 和 VB.Net 一样避免冲突。当发出泛型类型名称时,附加一个 ` 符号和泛型参数的数量。例如,实际上为上面生成了以下类型名称

class Test`1 // Test<T>
class Test`2 // Test<T1,T2>
Run Code Online (Sandbox Code Playgroud)

您可以使用反射器在 BCL 中查看此名称修改。将语言设置为 IL 而不是 C#,它将显示元数据中发出的实际类型名称,而不是美化的语言名称。