我有一个非常复杂的需求,需要使用Reflection Emit包创建一个类。该类是一个简单的DTO,将与WCF一起用于定义服务。真的很简单。但是,I必须使用嵌套类型。
我目前的测试不起作用。我可以创建主类型,但无法创建嵌套类型。
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进行级联执行,但毕竟,我不需要调用任何东西来创建方法、托管该类型的程序集等。
首先,我认为您必须调用nested_type_builder.CreateType()
,否则会得到一个异常。
但如果我那样做了,它的行为会很奇怪。从serviceClassBuilder.CreateType()
返回的Type
似乎不包含任何嵌套类型,至少如果您使用GetNestedTypes()
来查看它们的话但是如果您真的将程序集保存到磁盘并查看它,它会完全包含嵌套类型。
因此,如果您只需要使用生成的程序集文件,您应该可以了。我认为TypeBuilder
返回的类型的GetNestedTypes()
的行为是一个错误。