C#循环遍历子类

C#循环遍历子类,c#,class,loops,inheritance,C#,Class,Loops,Inheritance,对C#来说非常陌生,所以如果这是一个愚蠢的问题,请原谅我 如果我有一个名为Validator的基类,以及许多继承自该类的类,如validateFirstname、validateSecondname等。。。是否可以编写一个方法来循环遍历这些子类并实例化每个子类 类似于 public class loadValidators { public loadValidators() { foreach (subclass in class) { // instant

对C#来说非常陌生,所以如果这是一个愚蠢的问题,请原谅我

如果我有一个名为Validator的基类,以及许多继承自该类的类,如validateFirstname、validateSecondname等。。。是否可以编写一个方法来循环遍历这些子类并实例化每个子类

类似于

public class loadValidators
{
  public loadValidators()
  {
   foreach (subclass in class)
     {
       // instantiate class here
     }
  }
}
我们将一如既往地感谢您的帮助。

试试以下方法:

var validator_type = typeof (Validator);

var sub_validator_types = 
    validator_type
    .Assembly
    .DefinedTypes
    .Where(x => validator_type.IsAssignableFrom(x) && x != validator_type)
    .ToList();


foreach (var sub_validator_type in sub_validator_types)
{
    Validator sub_validator = (Validator)Activator.CreateInstance(sub_validator_type);
}
此代码假定所有子类与验证器类位于同一程序集/项目中

此外,它假设每个子类都有一个公共的无参数构造函数

请注意,我不推荐这种方法

相反,您应该这样做来解决您的问题(建模/使用多个验证器):

CompositeValidator
包装了多个验证器,并知道如何使用这些验证器验证对象

您可以这样使用它:

var composite_validator = new CompositeValidator(new FirstNameValidator() , new LastNameValidator());

composite_validator.Validate(obj);

非常感谢你!因此,我所拥有的与您提供的第二个解决方案非常相似(因为我正在学习教程)。我想知道是否有可能通过循环创建验证,原因是能够编写一个新的验证器,并将其自动包含在复合验证器中。因此,我可以运行loadValidators函数,将所有验证器添加到一个列表中,然后将该列表传递给composite_validator的参数,而不是每次编写新的验证器时都必须将新的验证器传递到composite validator的参数中。或者这是一个糟糕的想法吗?因此,我可以选择loadValidators(),然后是composite_validator(person),而不是composite_validator(新的v1(),新的v2(),新的v3()等等)。我会选择
composite_validator(新的v1(),新的v2(),新的v3()等等)
。这就是在中编写应用程序的方式
var composite_validator = new CompositeValidator(new FirstNameValidator() , new LastNameValidator());

composite_validator.Validate(obj);