2015-09-26 103 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/) –