简体   繁体   English

C#循环子类

[英]C# Loop Through Subclasses

Very new to C# so forgive me if this is a silly question. 对C#来说很新,如果这是一个愚蠢的问题,请原谅我。

If I have a base class called Validator, and a number of classes which inherit from this class such as validateFirstname, validateSecondname etc... is it possible to write a method which will loop through each of these subclasses and instantiate each? 如果我有一个名为Validator的基类,并且有许多继承自此类的类,例如validateFirstname,validateSecondname等...是否可以编写一个循环遍历每个子类并实例化每个子类的方法?

Something along the lines of 有点像

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

Any help is much appreciated as always. 任何帮助都一如既往地受到赞赏。

Try this: 尝试这个:

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

This code assumes that all the sub classes live in the same assembly/project as the Validator class. 此代码假定所有子类与Validator类位于同一程序集/项目中。

Also, it assumes that each of the subclasses have a public parameterless constructor. 此外,它假定每个子类都有一个公共无参数构造函数。

Please note that I would not recommend this approach. 请注意,我不推荐这种方法。

Instead you should do something like this to solve your problem (of modeling/using multiple validators): 相反,你应该做这样的事情来解决你的问题(建模/使用多个验证器):

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

The CompositeValidator wraps multiple validators and knows how to validate objects using those validators. CompositeValidator包装多个验证器,并知道如何使用这些验证器验证对象。

You can use it like this: 你可以像这样使用它:

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

composite_validator.Validate(obj);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM