4

我在运行时生成新类型,在生成默认构造函数后,我想生成另一个带有参数的构造函数。我这样做是这样的:

cb = tb.DefineConstructor(MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName,
                    CallingConventions.Standard, new Type[] { typeof(bool) });
GenConstructorWithParameters(cb, fields, genFields);

问题是,我无法从方法 GenConstructorWithParameters 调用默认构造函数,因为 CLR 不允许我编写如下内容:

gen.Emit(OpCodes.Ldarg_0);        
gen.Emit(OpCodes.Call, cb.DeclaringType.GetConstructor(Type.EmptyTypes));//Not allowed to call .GetConstructor() on not created type!

如何发出对默认构造函数的调用?有可能吗?

tb - 的实例TypeBuilder,cb -ConstructorBuilder

4

3 回答 3

4

你想要newobj

gen.Emit(OpCodes.Newobj, cb.DeclaringType.GetConstructor(Type.EmptyTypes));
于 2011-07-27T13:15:40.903 回答
4

而不是使用DeclaringType.GetConstructor,您应该将您的 current 传递给ConstructorBuilder默认构造函数。

基本上,在构建类型时,在您可能对现有类型使用基于反射的方法的地方,您应该传入您已经使用的构建器。


所以它会是:

gen.Emit(OpCodes.Call, defaultCB);

您在定义默认构造函数时声明的位置defaultCB在哪里。ConstructorBuilder

于 2011-07-27T13:22:14.057 回答
0
Dim objCtor As ConstructorInfo = objType.GetConstructor(New Type() {})

      Dim pointCtor As ConstructorBuilder = pointTypeBld.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, ctorParams)
      Dim ctorIL As ILGenerator = pointCtor.GetILGenerator()

      ctorIL.Emit(OpCodes.Ldarg_0)
      ctorIL.Emit(OpCodes.Call, objCtor)

      ctorIL.Emit(OpCodes.Ldarg_0)
      ctorIL.Emit(OpCodes.Ldarg_1)
      ctorIL.Emit(OpCodes.Stfld, xField)

      ctorIL.Emit(OpCodes.Ldarg_0)
      ctorIL.Emit(OpCodes.Ldarg_2)
      ctorIL.Emit(OpCodes.Stfld, yField)

      ctorIL.Emit(OpCodes.Ldarg_0)
      ctorIL.Emit(OpCodes.Ldarg_3)
      ctorIL.Emit(OpCodes.Stfld, zField)

      ctorIL.Emit(OpCodes.Ret)

Dim myDynamicType As Type = Nothing
Dim myDTctor As ConstructorInfo = myDynamicType.GetConstructor(aPtypes)
      Console.WriteLine("Constructor: {0};", myDTctor.ToString())
于 2011-07-27T13:26:31.813 回答