如何将项目中的所有类添加到列表中

时间:2014-08-28 11:53:49

标签: c# design-patterns

我搜索了互联网,试图找到解决这个问题的方法。阅读了很多关于单身人士和这些模式的内容,但我无法找到解决我特定问题的好方法(尽管我认为这是一个非常简单的问题)。

我得到了一个包含很多派生类的解决方案。我想要的是有一个列表/容器/我可以引用/访问/从中包含我的解决方案中每个类的对象。

这样的事情:

public class Main
{
    public static List<Operation> classList;
    public Main()
    {
        initialize();
    }

    public void initialize()
    {
        classList = new List<Operation>();
        Operation operation1 = new operation1();
        Operation operation2 = new operation2();
        classList.Add(operation1);
        classList.Add(operation2);
    }
}

操作类派生自Main。

Operation1和Operation2类派生自Operation类。

更新:

之后我想要的是这样的:

classList[].callMethodFromClass or classList("operation1").callMethodFromClass

2 个答案:

答案 0 :(得分:2)

你需要反思:

IEnumerable<Type> derivedTypes = Assembly
    .GetAssembly(typeof(Operation))
    .GetTypes()
    .Where(type => typeof(Operation).IsAssignableFrom(type));

然后,对于每种类型,您可以使用Activator

创建实例
Operation operation = (Operation)Activator.CreateInstance(type);

上面的代码假定所有派生类型都与Operation类位于同一个程序集中。如果它们分布在多个程序集中,那么您需要为每个程序集重复上述过程。另请注意,Operation类型本身将包含在类型集合中。如果这是一个问题,那么你需要专门检查它。

请注意,上述Activator代码仅适用于具有不带参数的构造函数的类。如果你有任何不适合这种模式的类,那么事情会变得更加复杂。 CreateInstance有一个重载,它将一个对象数组用作构造函数参数,但问题在于确定这些参数应该是什么。这需要一些关于你正在处理的特定课程的知识。换句话说,你需要为此添加一个检查,以确保某些类不会意外破坏你的代码,并且你要求所有类都有一个符合某个标准的构造函数(例如,参数)。

答案 1 :(得分:1)

这将找到从“操作”派生的程序集中的所有类型。但是,解决方案可以包含多个程序集。

Type baseType = typeof(Operation);
foreach (var type in typeof(Main).Assembly.GetTypes()
    .Where(type => baseType.IsAssignableFrom(type))) {
        classList.Add(type);
}

编辑:我忘了添加这些类型的实例而不是Type本身。 所以你需要使用

classList.Add((Operation)Activator.CreateInstance(type));

代替。