派生クラスから呼び出されないc#静的コンストラクター
-
29-10-2019 - |
質問
Bussの静的フィールドへの参照がBusの静的コンストラクターをトリガーするようにこれを機能させる方法について何かアイデアはありますか?
解決
これがあなたにとって重要であるという事実は、おそらく静的コンストラクターを間違って使用していることを意味します。
それを念頭に置いて、Buss
の静的コンストラクターを手動で呼び出すBus
の静的コンストラクターを作成できます。静的コンストラクターを複数回実行することはできないことに注意してください。
他のヒント
MSDNによると静的コンストラクターは継承されません。これも継承されない静的フィールドに似ていると思います。
ジェネリック型の静的コンストラクターは、その型が参照されるときに、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
を設定することはありません。これは、基本クラスBuss
の静的コンストラクターを呼び出してBus<Buss>
を設定する型引数Buss.field
を最初に解決するためです。 Bugs
基本クラスの静的コンストラクターを呼び出そうとすると、静的Bus<Buss>
コンストラクターが既に呼び出されていると見なされ、スキップされます。
基本的に、コードをコピーして貼り付け、ダミーのArgument
クラスを作成し、Buss
の新しいインスタンスを作成すると、静的コンストラクターが呼び出され、Buss.field
がインスタンスに設定されます。 Argument
の、しかし私はここでいくつかの奇妙な振る舞いを認識しています。そこでは、静的メソッドからの反射を使用してサブクラスの静的に到達しないようにアドバイスする必要があります。
提供した例は、Buss
がそれ自体の型引数であるためにのみ機能します。