2015-09-26 95 views
1

C#非常新,所以如果这是一个愚蠢的问题,请原谅我。C#循环通过子类

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

东西沿着

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

任何帮助的线条非常感谢一如既往。

回答

2

试试这个:

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

太谢谢你了!所以我所拥有的与您提供的第二种解决方案非常相似(因为我正在学习一个教程)。我想知道是否可以通过循环创建验证的原因是能够编写一个新的验证器,并将它自动包含在composite_validator中。因此,每次我编写一个新的验证器时,不必将新验证器传递到复合验证器的参数中,我可以运行loadValidators函数,该函数立即将所有验证器添加到列表中,然后将此列表传递给参数composite_validator。 – user2085143

+0

或者这是一个可怕的想法?所以而不是composite_validator(新的v1(),新的V2(),新的V3()等..)我可以去loadValidators(),然后composite_validator(人)。 – user2085143

+0

我会用'composite_validator(new v1(),new v2(),new v3()等)。这就是你在[Composition Root]中编写应用程序的方式(http://blog.ploeh.dk/2011/07/28/CompositionRoot/) –