如何将项目中的所有类添加到列表中
本文关键字:添加 列表 项目 | 更新日期: 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));
相反。