私のアプリケーションでは、複数のプロパティを含む型を動的に作成する必要があります。このような場合、ILGeneratorを使用して、プロパティのgetterメソッドとsetterメソッドの両方に対してCILを生成する必要があることを認識しています。
何よりも試行錯誤の末、ついにセッターメソッドを生成する次のコードにたどり着きました。
MethodBuilder setMethod = customTypeBuilder.DefineMethod(propertyName + "_set", MethodAttributes.Public | MethodAttributes.HideBySig, null, new Type[] {propertyType});
ILGenerator setIlGenerator = setMethod.GetILGenerator();
setIlGenerator.Emit(OpCodes.Ldarg_0);
setIlGenerator.Emit(OpCodes.Ldarg_1);
setIlGenerator.Emit(OpCodes.Stfld, backingField);
setIlGenerator.Emit(OpCodes.Ret);
コードは十分に機能しますが、私が理解していないことが1つあります。'Ldarg_0'命令を呼び出す必要があるのはなぜですか?
メソッドの暗黙の最初の引数である「this」参照を参照していることを知っているので、セッターの実際の値は2番目の引数に格納されます。Ldarg_1命令のみを呼び出すだけで十分だと思いました。これにより、2番目の引数がスタックにプッシュされます(最終的に、セッターでは、「this」参照を調べる必要がないため、次のことを行う必要はありません。それで何でもします)、しかしこれは私がプロパティの値を設定しようとするとTargetInvocationExceptionがスローされる結果になります。
ありがとうございました!