2

特定のタイプの新しいオブジェクトを作成してフィールドにロードしようとしていますが、

無効なプログラム例外。

ローカルを使用して同じことを行うとうまくいきます。多分フィールドで何か間違ったことをしていますか?これは動作しません:

MethodAttributes getSetAttr = MethodAttributes.Virtual | MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;
FieldBuilder propNameBldr = typeBuilder.DefineField("_" + PropName, PropType, FieldAttributes.Private);
propNamePropBldr = typeBuilder.DefineProperty(PropName, PropertyAttributes.HasDefault, PropType, null);
propNameGetPropMthdBldr = typeBuilder.DefineMethod("get_" + PropName, getSetAttr, PropType, Type.EmptyTypes);
ConstructorInfo baseCtor = basePropType.GetConstructor(new Type[] { });

ILGenerator propNameGetIL = propNameGetPropMthdBldr.GetILGenerator();

propNameGetIL.Emit(OpCodes.Newobj, baseCtor);
propNameGetIL.Emit(OpCodes.Stfld, PropNameBldr);

propNameGetIL.Emit(OpCodes.Ldfld, PropNameBldr);
propNameGetIL.Emit(OpCodes.Ret);
propNamePropBldr.SetGetMethod(propNameGetPropMthdBldr);

しかし、これは機能します:

MethodAttributes getSetAttr = MethodAttributes.Virtual | MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;
FieldBuilder propNameBldr = typeBuilder.DefineField("_" + PropName, PropType, FieldAttributes.Private);
propNamePropBldr = typeBuilder.DefineProperty(PropName, PropertyAttributes.HasDefault, PropType, null);
propNameGetPropMthdBldr = typeBuilder.DefineMethod("get_" + PropName, getSetAttr, PropType, Type.EmptyTypes);
ConstructorInfo baseCtor = basePropType.GetConstructor(new Type[] { });

ILGenerator propNameGetIL = propNameGetPropMthdBldr.GetILGenerator();
LocalBuilder lc = propNameGetIL.DeclareLocal(PropType);
propNameGetIL.Emit(OpCodes.Newobj, baseCtor);
propNameGetIL.Emit(OpCodes.Stloc, PropNameBldr);

propNameGetIL.Emit(OpCodes.Ldloc, PropNameBldr);
propNameGetIL.Emit(OpCodes.Ret);
propNamePropBldr.SetGetMethod(propNameGetPropMthdBldr);

では、違いは何ですか?なぜ最初に機能しないのですか? ありがとう。

4

1 に答える 1

1

非静的フィールドにはオブジェクト参照が必要です。

IL を生成するより良い方法は、式ツリーを使用することです。

また、C# で同等のコードを記述し、コンパイラの出力を逆コンパイルすることで、このようなすべての質問に自分で答えることができます。

于 2016-03-24T18:23:07.633 に答える