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 回答