Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将项目中的所有类添加到列表中_C#_Design Patterns - Fatal编程技术网

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

请问-为什么需要这样的容器?什么