【问题标题】:C# Loop Through SubclassesC# 循环遍历子类
【发布时间】:2015-09-26 09:23:19
【问题描述】:

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

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

类似的东西

public class loadValidators
{
  public loadValidators()
  {
   foreach (subclass in class)
     {
       // instantiate class here
     }
  }
}

一如既往地感谢任何帮助。

【问题讨论】:

    标签: c# class loops inheritance


    【解决方案1】:

    试试这个:

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

    此代码假定所有子类与 Validator 类位于同一程序集/项目中。

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

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

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

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

    【讨论】:

    • 非常感谢!所以我所拥有的与您提供的第二个解决方案非常相似(因为我正在学习教程)。我想知道是否可以通过循环创建验证的原因是能够编写一个新的验证器,并将其自动包含在复合验证器中。因此,不必在每次编写新验证器时都将新验证器传递到复合验证器的参数中,而是可以运行 loadValidators 函数,该函数即时化所有验证器,将它们添加到列表中,然后将此列表传递给参数复合验证器。
    • 或者这是一个糟糕的主意?所以我可以代替 Composite_validator(new v1(), new v2(), new v3() 等..) 我可以去 loadValidators(),然后是 Composite_validator(person)。
    • 我会选择composite_validator(new v1(), new v2(), new v3() etc..)。这就是您在 Composition Root 中编写应用程序的方式
    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 2012-07-22
    • 2011-01-25
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多