2016-04-27 3 views
0

Я генерирую новый динамический тип и не создаю его экземпляр. Но когда на самом деле создать код создания экземпляра, он терпит неудачу с исключением: No parameterless constructor defined for this object.Невозможно создать экземпляр сгенерированного типа: для этого объекта не задан конструктор без параметров

Мой код выглядит следующим образом:

AssemblyBuilder aBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("dfsdfsdf"), AssemblyBuilderAccess.Run); 
ModuleBuilder mBuilder = aBuilder.DefineDynamicModule("dsadsadasdasda"); 
TypeBuilder typeBlank = mBuilder.DefineType("dasvvvvvvvv", TypeAttributes.Class | TypeAttributes.Public); 
ConstructorBuilder cb = typeBlank.DefineDefaultConstructor(MethodAttributes.Public); 
Type t = cb.GetType(); 
var item = Activator.CreateInstance(t); // <--- Error appear in this line. 

Что плохого?

+0

Какая именно эта ошибка появляется? –

+0

в последнем –

+2

вы пробовали определить конструктор без параметров? : O – Kritner

ответ

6

Вы пытаетесь создать экземпляр ConstructorBuilder, а не свой сгенерированный класс.

Я думаю, что вы хотите:

... 
ConstructorBuilder cb = typeBlank.DefineDefaultConstructor(MethodAttributes.Public); 
Type t = typeBlank.CreateType(); 
var item = Activator.CreateInstance(t); 

Обратите внимание, что конструктор по умолчанию без параметров создается по умолчанию; Вам не нужно, чтобы создать одну, за исключением следующих случаев:

(от MSDN):

Поскольку конструктор по умолчанию автоматически определяется, то необходимо вызвать этот метод только в следующих ситуациях :

  • Вы определили другой конструктор, а также хотите, чтобы конструктор по умолчанию просто вызывал конструктор базового класса.
  • Вы хотите установить атрибуты конструктора по умолчанию к чему-то другому, чем PrivateScope, Public, HideBySig, SpecialName, и RTSpecialName.
+0

Спасибо, да, это правильно. Просто попробуйте другие вещи и пропустите, что GetType() и CreateType() возвращают разные результаты. Кстати, еще один вопрос - может быть, вы просто знаете ответ, потому что я не смог его найти. Существует динамическая сборка, связанная с этим типом. Если у меня нет экземпляра assemblyBuilder для этих сборок, есть ли возможность добавить в него еще несколько типов в будущем? Мне нужно генерировать поддельные типы для сборки для тестирования проб, и для меня важно, чтобы они могли динамически добавлять и удалять их. –

+0

@silent_coder Если у вас есть другой вопрос, вы должны * задать новый вопрос *. – svick