Генерация конструктора, который принимает аргумент и просто вызывает base (аргумент), используя TypeBuilder - PullRequest
5 голосов
/ 07 декабря 2011

Я пытаюсь динамически создать пустой конструктор, который принимает аргумент и просто вызывает base (аргумент), используя TypeBuilder.

Мой код выглядит примерно так:

(...)
// Create a class derived from this class
TypeBuilder typeBuilder = moduleBuilder.DefineType("NewClass", TypeAttributes.Class, this.GetType());    
ConstructorInfo baseCtor = this.GetType().GetConstructor(new[] { typeof(int) });

// Define new ctor taking int
ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public,  CallingConventions.Standard, new[] { typeof(int) });

// Generate code to call base ctor passing int
ILGenerator ctorIL = constructorBuilder.GetILGenerator();
ctorIL.Emit(OpCodes.Ldarg_0);
ctorIL.Emit(OpCodes.Ldarg_1);
ctorIL.Emit(OpCodes.Call, baseCtor);
ctorIL.Emit(OpCodes.Ret);

// Generate derived class
Type type = typeBuilder.CreateType();

// Try to instantiate using new constructor 
ConstructorInfo ctor = type.GetConstructor(new[] { typeof(int) });
object instance = ctor.Invoke(new object[] { 42 });
(...)

, но всегдане удалось сгенерировать исключение
System.Reflection.TargetInvocationException: NewClass..ctor(int32)
Что я делаю не так?

Заранее большое спасибо за любую помощь,
Паоло

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