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



我有一个非常复杂的需求,需要使用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()的行为是一个错误。

相关内容

  • 没有找到相关文章

最新更新