TypeBuilderを使用したコンストラクターを介してベースタイプからストリングへの値の割り当て

StackOverflow https://stackoverflow.com//questions/24022452

  •  21-12-2019
  •  | 
  •  

質問

基本クラスとクラスをプログラムで定義し、ベースコンストラクタを呼び出すコンストラクタを定義しようとしています。サブクラスコンストラクタのジョブの一部は、名前と呼ばれる文字列を値に初期化することです。しかし、私が何を試しても、名前がnullのままです。一部のArrayListが初期化されているため、ベースコンストラクタは正しく機能します.puestignatureは文字列です。フィールド名はすでに基本クラスに存在します。

FieldBuilder fbname = tb.DefineField("name", typeof(string), FieldAttributes.Public);

ILGenerator ctor1IL = ctor1.GetILGenerator();
ctor1IL.Emit(OpCodes.Ldarg_0);

//get base constructor
var bc = tb.BaseType.GetConstructor(System.Type.EmptyTypes);
ctor1IL.Emit(OpCodes.Call, bc);  
ctor1IL.Emit(OpCodes.Ldarg_0);
ctor1IL.Emit(OpCodes.Ldstr, typeSignature);
ctor1IL.Emit(OpCodes.Stfld, fbname);
ctor1IL.Emit(OpCodes.Ret);
.

役に立ちましたか?

解決

フィールド名は既に基本クラスに存在します。

これは、基本クラスのフィールドnameがすでにあるように聞こえます。その場合、コードが実行されるのは、派生クラスのnameという別のフィールドを作成することです。その後、基本クラスのものには書き込まれず、そのフィールドに書き込みます。

あなたがするべきことは次のようなものです:

FieldInfo nameField = tb.BaseType.GetField("name");

…

ctor1IL.Emit(OpCodes.Stfld, nameField);
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top