Как создать вложенный тип, используя Reflection.Emit? - PullRequest
0 голосов
/ 04 февраля 2012

У меня очень сложная необходимость создать класс с помощью пакета 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 голосов
/ 04 февраля 2012

Во-первых, я думаю, вам нужно позвонить nested_type_builder.CreateType(), или вы получите исключение.

Но если бы я сделал это, он вел себя странно. Type, возвращаемый из serviceClassBuilder.CreateType(), по-видимому, не содержит вложенных типов, по крайней мере, если вы посмотрите на них, используя GetNestedTypes(). Но , если вы на самом деле сохраняете сборку на диск и просматриваете ее, она содержит вложенный тип в точности так, как должна.

Итак, если вам нужно работать только с сгенерированным файлом сборки, все будет в порядке. Я думаю, что поведение GetNestedTypes() типа, возвращаемого TypeBuilder, является ошибкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...