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

を使用するのではなく、デフォルトのコンストラクターにDeclaringType.GetConstructorcurrent を渡す必要があります。ConstructorBuilder

基本的に、既存の型に対してリフレクション ベースのメソッドを使用する可能性がある場所では、型を構築する際に、代わりに既に使用しているビルダーを渡す必要があります。


したがって、次のようになります。

gen.Emit(OpCodes.Call, defaultCB);

デフォルトのコンストラクターを定義するときに宣言したdefaultCBのはどこですか。ConstructorBuilder

于 2011-07-27T13:22:14.057 に答える
4

あなたがしたいnewobj

gen.Emit(OpCodes.Newobj, cb.DeclaringType.GetConstructor(Type.EmptyTypes));
于 2011-07-27T13:15:40.903 に答える
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 に答える