有没有初始化的设计模式?C#

有没有初始化的设计模式?C#,c#,reflection,singleton,C#,Reflection,Singleton,我有一个名为initialize的类,它在程序开始时运行。最初,我显式地硬编码了它应该实例化的所有类,但我想让它更通用,并删除硬编码的类,这样我就可以将类标记为关闭以进行修改 我的第一个想法是创建一个类型队列,我的initialize类将在其中循环并实例化队列中的所有类型 然后,我想根据每个类来决定是否将其添加到队列中。通过将自身从类中添加到队列。问题是,我不能将类添加到队列中,除非它已经被实例化。我知道变量可以在运行之前初始化,但显然不是方法。所以我一直在琢磨我想做的事是否可能 大致如下: M

我有一个名为initialize的类,它在程序开始时运行。最初,我显式地硬编码了它应该实例化的所有类,但我想让它更通用,并删除硬编码的类,这样我就可以将类标记为关闭以进行修改

我的第一个想法是创建一个类型队列,我的initialize类将在其中循环并实例化队列中的所有类型

然后,我想根据每个类来决定是否将其添加到队列中。通过将自身从类中添加到队列。问题是,我不能将类添加到队列中,除非它已经被实例化。我知道变量可以在运行之前初始化,但显然不是方法。所以我一直在琢磨我想做的事是否可能

大致如下:

MyClass
{

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

如果您正在初始化class
静态
状态,那么这是不必要的。只需在所有类型中添加一个静态构造函数,.NET运行时将在访问该类的任何静态成员(字段、方法、属性或事件)之前延迟调用该静态构造函数。这也适用于单例模式-但是正如我所说,静态构造函数是JIT评估的,这可能会在程序中引入不确定性延迟


另一种方法是使用反射迭代程序集中的每个
类型
,并执行您自己的初始化。这就是插件系统的工作原理。

如果我正确理解了你的问题,你正在寻找的模式是工厂方法模式。看看这个链接:

我的意思是这样的

    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
    { 
    }

您的初始化是什么还不是很清楚。如果你能给我们一个样品,那会很有帮助的。您是否正在寻找一个IoC容器?这是一个非常大且不断发展的程序吗?确保你考虑。是的,它是一个相当大的程序,它将不断地演变和变化。-你不能用自定义属性来修饰需要初始化的类,并有“初始化器”找到并“初始化”那些类吗?@ ANANTANONE这是一个有趣的想法,我现在正在查找它,但是我在查找示例时遇到了困难。似乎你不能用一个静态构造函数来告诉一个类创建一个自动运行的实例。或者也许有什么我不明白的?在MyClass中,我放置了以下构造函数,但没有结果。静态Myclass(){new Myclass;}我不这么认为,因为从我对工厂方法的理解来看,它仍然需要输入来告诉它要创建什么。它在初始化过程中进入输入,我遇到了麻烦。我想进入任意类并设置一个标志或任何东西来告诉它初始化。你可以使用带有参数的工厂模式。。。您可以做的另一件事是按照David的建议,使用reflection()创建这些类的实例并将它们存储在队列中。只是出于好奇,你到底为什么要这么做?这有点奇怪,有一个不确定的初始化序列正在进行。。。另一件事,用任意类型和任意参数调用任意构造函数(我认为这是您想要做的)这是一件非常危险的事情。我想将initializer类的状态标记为Closed以进行修改,但如果我必须不断地进入该类以添加需要初始化的新类,则这种情况永远不会发生。ananthonline的方法允许我关闭该类,而不再重新访问它。这正是我想要实现的。这真是太棒了,正是我想要的。我让它工作得很好,但现在我对它的用法很感兴趣,我试图更好地理解它,在哪里定义[Initialize]作为属性的名称?为什么不使用[InitializeAttribute]呢?在C#中,当使用从System.Attribute派生的类型装饰受支持的元素并称为XXXAttribute时,“属性”部分是可选的,可以省略。