2

プログラムの最初で実行される initialize というクラスがあります。もともと、インスタンス化するはずだったすべてのクラスを明示的にハードコーディングしましたが、より汎用的にして、ハードコーディングされたクラスを削除して、変更のためにクローズされたクラスをマークできるようにしたいと考えています。

最初に考えたのは、初期化クラスが循環し、キューにあるすべてのタイプをインスタンス化するタイプのキューを作成することでした。

次に、キューに追加するかどうかをクラスごとに決定したいと考えました。クラス内から自分自身をキューに追加する。問題は、インスタンス化されていない限り、クラスをキューに追加できないことです。実行前に変数を初期化できることは知っていますが、明らかにメソッドは初期化できません。だから私は、私がやりたいことは可能ではない天気を理解することに固執しています。

次のようなもの:

MyClass
{

 initalize.instance.Enqueue(typeof(MyClass));
}
4

3 に答える 3

3

私はこれらの線に沿って何かを意味しました。

    public static class Initializer
    {
        public static void Initialize()
        {
            foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
                foreach (var type in assembly.GetTypes())
                    if (type.IsDefined(typeof(InitializeAttribute), true))
                        Console.WriteLine("Need to initialize {0}", type.FullName);
        }
    }

    [AttributeUsage(AttributeTargets.Class)]
    public sealed class InitializeAttribute : Attribute
    { 
    }

    [Initialize]
    public sealed class ToBeInitialized
    { 
    }
于 2012-09-07T19:10:17.177 に答える
2

あなたが探しているパターンは、あなたの質問を正しく理解していれば、ファクトリ メソッド パターンです。このリンクを見てください: http://en.wikipedia.org/wiki/Factory_method_pattern#C.23

于 2012-09-07T18:59:15.970 に答える
1

クラスstaticの状態を初期化する場合、これは必要ありません。すべての型に静的コンストラクターを追加するだけで、.NET ランタイムは、そのクラスの静的メンバー (フィールド、メソッド、プロパティ、またはイベント) がアクセスされる前に、静的コンストラクターを遅延して呼び出します。これはシングルトン パターンでも機能しますが、前述したように、静的コンストラクターは JIT で評価されるため、プログラムに非決定論的な遅延が発生する可能性があります。

別の方法として、リフレクションを使用しTypeてアセンブリ内のそれぞれを反復処理し、独自の初期化を実行することもできます。これがプラグインシステムの仕組みです。

于 2012-09-07T18:44:01.760 に答える