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

本文关键字:添加 列表 项目 | 更新日期: 2023-09-27 18:19:54

我在互联网上搜索,试图找到这个问题的解决方案。读了很多关于singleton和此类模式的文章,但我找不到一个好的解决方案来解决我的特定问题(尽管我认为这是一个非常简单的问题)。

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

这样的东西:

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

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

您需要对此进行反思:

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有一个重载,它将一组对象用作构造函数参数,但问题在于确定这些参数应该是什么。这需要一些关于您正在处理的特定类的知识。换句话说,您需要添加一个检查,以确保某些类不会意外破坏您的代码,并且您需要要求所有类都有一个符合特定标准的构造函数(例如,没有参数)。

这将在程序集中查找从Operation派生的所有类型。不过,一个解决方案可以包含多个程序集。

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

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

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

相反。