C# 遍历子类

标签 c# class loops inheritance

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);
}

此代码假定所有子类都位于与验证器类相同的程序集/项目中。

此外,它假定每个子类都有一个公共(public)无参数构造函数。

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

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

public interface IValidator
{
    bool Validate(SomeObject something);
}

public class FirstNameValidator : IValidator
{
    public bool Validate(SomeObject something)
    {
        ...
    }
}

public class LastNameValidator : IValidator
{
    public bool Validate(SomeObject something)
    {
        ...
    }
}

public class CompositeValidator : IValidator
{
    private readonly IValidator[] m_Validators;

    public CompositeValidator(params IValidator[] validators)
    {
        m_Validators = validators;
    }

    public bool Validate(SomeObject something)
    {
        foreach (IValidator validator in m_Validators)
        {
            if (!validator.Validate(something))
                return false;
        }

        return true;
    }
}

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

你可以这样使用它:

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

composite_validator.Validate(obj);

关于C# 遍历子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32795582/

相关文章:

c# - 在 C# 中使用流进行单元测试

c# - 在 .ASPX 文件中使用 Eval()

loops - 一遍多个Ansible任务

r - 使用 R 优化/矢量化数据库查询

c# - 等同于 PHP 的 header 包括

c# - 如何最好地将整个应用程序本地化为多种不同的语言?

c++ - 错误: invalid use of non-static member function C++

java - 将加载的类保存到文件

Java抽象类和接口(interface)方法实现

php - 这一行正在覆盖数组