C# 如何将项目中的所有类添加到列表中
我在网上搜索,试图找到解决这个问题的办法。读了很多关于单例和这样的模式的书,但是我找不到一个很好的方法来解决我的问题(尽管我认为这是一个非常简单的问题) 我得到了一个包含很多派生类的解决方案。我想要的是一个列表/容器/我可以引用/访问/从中包含解决方案中每个类的对象的东西 比如说:C# 如何将项目中的所有类添加到列表中,c#,design-patterns,C#,Design Patterns,我在网上搜索,试图找到解决这个问题的办法。读了很多关于单例和这样的模式的书,但是我找不到一个很好的方法来解决我的问题(尽管我认为这是一个非常简单的问题) 我得到了一个包含很多派生类的解决方案。我想要的是一个列表/容器/我可以引用/访问/从中包含解决方案中每个类的对象的东西 比如说: public class Main { public static List<Operation> classList; public Main() { initi
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);
}
}
classList[].callMethodFromClass or classList("operation1").callMethodFromClass
这将查找程序集中从操作派生的所有类型。但是,解决方案可以包含多个程序集
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));
相反。这将查找程序集中从操作派生的所有类型。但是,解决方案可以包含多个程序集
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));
相反。这将查找程序集中从操作派生的所有类型。但是,解决方案可以包含多个程序集
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));
相反。这将查找程序集中从操作派生的所有类型。但是,解决方案可以包含多个程序集
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));
相反。您需要对此进行反思:
IEnumerable<Type> derivedTypes = Assembly
.GetAssembly(typeof(Operation))
.GetTypes()
.Where(type => typeof(Operation).IsAssignableFrom(type));
上面的代码假定所有派生类型都与操作类驻留在同一程序集中。如果它们分布在多个程序集上,则需要对每个程序集重复上述过程。还请注意,操作类型本身将包含在类型集合中。如果这是一个问题,那么你需要特别检查它
请注意,上述激活器代码仅适用于具有不带参数的构造函数的类。如果您有任何不符合该模式的类,那么事情就会变得更加复杂。CreateInstance有一个重载,它将对象数组用作构造函数参数,但问题在于确定这些参数应该是什么。这将需要一些关于您正在处理的特定类的知识。换句话说,您需要为此添加一个检查,以确保某些类不会意外地破坏您的代码,并且您需要要求所有类都具有符合特定标准(例如,无参数)的构造函数。您需要对此进行反射:
IEnumerable<Type> derivedTypes = Assembly
.GetAssembly(typeof(Operation))
.GetTypes()
.Where(type => typeof(Operation).IsAssignableFrom(type));
上面的代码假定所有派生类型都与操作类驻留在同一程序集中。如果它们分布在多个程序集上,则需要对每个程序集重复上述过程。还请注意,操作类型本身将包含在类型集合中。如果这是一个问题,那么你需要特别检查它
请注意,上述激活器代码仅适用于具有不带参数的构造函数的类。如果您有任何不符合该模式的类,那么事情就会变得更加复杂。CreateInstance有一个重载,它将对象数组用作构造函数参数,但问题在于确定这些参数应该是什么。这将需要一些关于您正在处理的特定类的知识。换句话说,您需要为此添加一个检查,以确保某些类不会意外地破坏您的代码,并且您需要要求所有类都具有符合特定标准(例如,无参数)的构造函数。您需要对此进行反射:
IEnumerable<Type> derivedTypes = Assembly
.GetAssembly(typeof(Operation))
.GetTypes()
.Where(type => typeof(Operation).IsAssignableFrom(type));
上面的代码假定所有派生类型都与操作类驻留在同一程序集中。如果它们分布在多个程序集上,则需要对每个程序集重复上述过程。还请注意,操作类型本身将包含在类型集合中。如果这是一个问题,那么你需要特别检查它
请注意,上述激活器代码仅适用于具有不带参数的构造函数的类。如果您有任何不符合该模式的类,那么事情就会变得更加复杂。CreateInstance有一个重载,它将对象数组用作构造函数参数,但问题在于确定这些参数应该是什么。这将需要一些关于您正在处理的特定类的知识。换句话说,您需要为此添加一个检查,以确保某些类不会意外地破坏您的代码,并且您需要要求所有类都具有符合特定标准(例如,无参数)的构造函数。您需要对此进行反射:
IEnumerable<Type> derivedTypes = Assembly
.GetAssembly(typeof(Operation))
.GetTypes()
.Where(type => typeof(Operation).IsAssignableFrom(type));
上面的代码假定所有派生类型都与操作类驻留在同一程序集中。如果它们分布在多个程序集上,则需要对每个程序集重复上述过程。还请注意,操作类型本身将包含在类型集合中。如果这是一个问题,那么你需要特别检查它
请注意,上述激活器代码仅适用于具有不带参数的构造函数的类。如果您有任何不符合该模式的类,那么事情就会变得更加复杂。CreateInstance有一个重载,它将对象数组用作构造函数参数,但问题在于确定这些参数应该是什么。这将需要一些关于您正在处理的特定类的知识。换句话说,您需要为此添加一个检查,以确保某些类不会意外地破坏您的代码,并且您需要要求所有类都有一个符合特定标准(例如,无参数)的构造函数。请问-为什么需要这样的容器?什么