如何使用Reflection.Emit创建嵌套类型?

时间:2012-02-03 21:44:00

标签: .net reflection

我非常需要使用Reflection Emit包创建一个类。该类是一个简单的DTO,将与WCF一起使用来定义服务。简单,真的。但是,我必须使用嵌套类型。

我目前的测试不起作用。我可以创建主类型但我无法创建嵌套类型。

var serviceClassBuilder = _module.DefineType("something", TypeAttributes.Public | TypeAttributes.Class);

// Create a nested class that will hold the input definition
var nested_type_builder = serviceClassBuilder.DefineNestedType(className,
    TypeAttributes.NestedPublic | TypeAttributes.Class |
    TypeAttributes.SequentialLayout);

serviceClassBuilder.CreateType(); // <-- NOT WHAT I EXPECTED!

创建的类中没有任何嵌套类型。可能吗?这些类很简单。我上面已经阅读了Emit包的一些限制,但我不确定它是否适用于我使用的这样一个简单的例子。

我甚至尝试在创建类型之前添加以下行:

nested_type_builder.CreateType();

即使我认为第一个构建器应该已经完成​​了CreateType的级联执行,但毕竟我不需要调用任何东西来创建方法,承载类型的程序集等等。

1 个答案:

答案 0 :(得分:0)

首先,我认为您必须致电nested_type_builder.CreateType(),否则您将获得例外。

但如果我这样做,它表现得很奇怪。从Type返回的serviceClassBuilder.CreateType()似乎不包含任何嵌套类型,至少如果您使用GetNestedTypes()查看它们。 如果您实际将程序集保存到磁盘并查看它,它将完全包含嵌套类型。

因此,如果您只需要使用生成的程序集文件,那么您应该没问题。我认为GetNestedTypes()返回的TypeBuilder类型的行为是一个错误。