views:

27

answers:

1

How can I generate types like these using the System.Reflection.Emit libraries:

public class Test<T> {}
public class Test<T1, T2> {}

When I call ModuleBuilder.DefineType(string) with the second type declaration, I get an exception because there is already another type in the module with the same name (I've already defined the type parameter on the first type). Any ideas?

+3  A: 

You should avoid the conflict in the same way that C# and VB.Net do. When emiting a generic type name append a ` symbol and the number of generic parameters. For example the following type names actually get generated for the above

class Test`1 // Test<T>
class Test`2 // Test<T1,T2>

You can view this name mangling in the BCL with reflector. Set the language to IL instead of C# and it will show the actual names of type as emitted in metadata instead of the prettified language name.

JaredPar
Worked perfectly. Thanks for you're answer!
Wesley Wiser