0

さて、私はそこにあるこれら2つのことに少し問題があります

次の状況:抽象クラス「Emitter」を取得しました。このクラスには、派生するすべてのタイプを追跡するための静的ディクショナリがあります。

たとえば、クラス「LinearEmitter」があり、このクラスには静的コンストラクターがあります。このコンストラクターは、typeof(LinearEmitter)をディクショナリに追加します。問題は、Emitterの静的ディクショナリ(静的メソッド "getMeEmitterFromID(int id)")を使用したいときに、 "Emitter"の子(LinearEmitterなど)が初期化されていないことです(ファイルを作成し、「Emitter」のクラスからIDを検索して、そこからインスタンスを初期化します)。

すべてのChildクラスが以前に初期化されていることを確認するにはどうすればよいですか?(辞書に自分自身を書き込んだことがあります)?

of course others should use this library, and they should also use the static constructor to add their Classes to the "Emitter"'s Dictionary

any ideas?

4

2 に答える 2

2

Eric Lippert は、静的コンストラクターに関する優れたシリーズを発表しました。

静的コンストラクター パート 1 , 静的コンストラクター パート 2 , 静的コンストラクター パート 3 , 静的コンストラクター パート 4

あなたの場合に役立つビットを要約するには:静的コンストラクターはによって呼び出されます

  1. 静的メソッド/フィールドの最初のアクセスの直前。
  2. 型のインスタンスへの最初のアクセスの直前。

したがって、 のような静的メソッドを呼び出すか、Initialize()から派生した型のクラスをインスタンス化しますEmitter

.NETそれはさておき、静的初期化子の実行方法は/CLRバージョンごとに変更される可能性があり、必要がなければそれに依存しないため、問題を実装するためのより良い方法があると確信しています。

于 2013-02-15T19:06:12.327 に答える
0

ディクショナリ自体を公開するのではなく、実装の詳細にします。次に、のようなメソッドを作成できますGetByType(Type typeToGetFromDictionary)。これで、get メソッドは、まだ持っていない部分を遅延ロードできます。

そうは言っても、これは必要ではないかもしれないので、アーキテクチャを再考する必要があるというコメントに同意します。

于 2013-02-15T18:46:25.200 に答える