2011-10-28 1 views
2

は、(非常に簡略化された)の例である: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)。それは非常に古いニュースだが、あなたはそれについて知らなかった場合...それを試してみてください:)

+0

を。あなたはまだそのタイプを蹴っているべきですか? –

答えて

1

あなたは、静的TypeBuilder.GetFieldメソッドを使用する必要があります:あなたは、基本クラスを指定する必要がありましたいくつかの点で

var fieldInfo = TypeBuilder.GetField(typeof(BaseType<>).MakeGenericType(typeBuilderOfFinalClass), typeof(BaseType<>).GetField(...)) 
+0

TypeBuilderにも静的なGetFieldメソッドがあることに気づいていません。それは完璧に働いた。どうも。 – user1018735

関連する問題