6
class Bus<T>
{
    static Bus()
    {
        foreach(FieldInfo fi in typeof(T).GetFields())
        {
            if(fi.FieldType == typeof(Argument))
            {
                fi.SetValue(typeof(T), new Argument("busyname", "busyvalue"));
            }
        }
    }
}
class Buss : Bus<Buss>
{
    public static Argument field;
}

Bussの静的フィールドへの参照がBusの静的コンストラクターをトリガーするように、これを機能させる方法はありますか?

4

3 に答える 3

3

これがあなたにとって重要であるという事実は、おそらく静的コンストラクターを間違って使用していることを意味します。

それを念頭に置いて、 で静的コンストラクターBussを手動で呼び出す で静的コンストラクターを作成できますBus。静的コンストラクターを複数回実行することはできないことに注意してください。

于 2011-06-17T19:45:28.027 に答える
2

ジェネリック型の静的コンストラクターは、Typeその型が参照されるときに、ごとに1回だけ呼び出されます。

を呼び出すBuss x = new Buss()と、の静的コンストラクターが呼び出されますBus<Buss>

を呼び出すBus<Buss> x = new Bus<Buss>()と、の静的コンストラクターも呼び出されますがBus<Buss>、型引数Bussである設定に対して呼び出されますBuss.field

を作成した場合、class Bugs : Bus<Buss>それは設定されません。これBugs.fieldは、最初にtype引数Bussを解決し、その基本クラスの静的コンストラクターBus<Buss>、settingを呼び出すためですBuss.fieldBugs基本クラスの静的コンストラクターを呼び出そうとすると、静的コンストラクターが既に呼び出されていると見Bus<Buss>なされ、スキップされます。

基本的に、コードをコピーして貼り付け、ダミーArgumentクラスを作成し、の新しいインスタンスを作成するとBuss、静的コンストラクター呼び出され、のインスタンスBuss.field 設定されますがArgument、ここでは奇妙な動作を認識しています。静的メソッドからのリフレクションを使用して、サブクラスの静的メソッドに到達します。

Buss提供した例は、それ自体の型引数であるためにのみ機能します。

于 2011-06-17T20:09:32.307 に答える
1

MSDN は、「静的コンストラクターは継承されない」と述べています。これは、継承されない静的フィールドにも似ていると思います。

于 2011-06-17T20:05:46.583 に答える