は、(非常に簡略化された)の例である:emitを使ってサブクラスを作成するときにジェネリックベースクラスで宣言された静的フィールドを参照する方法は?ここ
public abstract class BaseClass<T> where T : BaseClass<T>
{
public static SomeOtherClass MyStaticField = new SomeOtherClass(typeof(BaseClass<T>));
}
public sealed class FinalClass : BaseClass<FinalClass>
{
static FinalClass()
{
MyStaticField.SomeProperty = 123;
}
}
BaseClassのコードで書かれてコンパイルされます。 Emitを使用して実行時にFinalClassを作成する必要があります。 Is it possible to emit a type deriving from a generic type while specifying itself as the generic type parameter?で議論されているクラスを放つことができました。
問題は、発光するときにフィールドMyStaticFieldを参照できないことです。 TypeBuilder.GetFieldを使用しようとしましたが、タイプがまだ「建設中」で、ファイナライズされていないため機能しません。私はtypeof(BaseClass <>)を使ってみました。MakeGenericType(typeBuildOfFinalClass)しかし、同じ理由で動作しません。
コードを手作業で作成して逆コンパイルすると、BaseClass.MyStaticFieldへの参照が表示されますが、その方法を見つけることができません。私は、opcode関数の引数を出すために必要なFieldInfoに到達する方法を知らない。
誰も私がこれを解決する方法を知っていますか?
Thx。
P.S. emitを使っている人にとっては、これは非常に役に立ちます(http://www.codeproject.com/KB/msil/emithelper.aspx)。それは非常に古いニュースだが、あなたはそれについて知らなかった場合...それを試してみてください:)
を。あなたはまだそのタイプを蹴っているべきですか? –