我搜索了互联网,试图找到解决这个问题的方法。阅读了很多关于单身人士和这些模式的内容,但我无法找到解决我特定问题的好方法(尽管我认为这是一个非常简单的问题)。
我得到了一个包含很多派生类的解决方案。我想要的是有一个列表/容器/我可以引用/访问/从中包含我的解决方案中每个类的对象。
这样的事情:
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
答案 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));
代替。