2015-09-26 2 views
1

Очень новый для C#, так что простите меня, если это глупый вопрос.C# Loop Through Subclasses

Если у меня есть базовый класс, называемый 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

Спасибо так много! Так что у меня очень похоже на второе решение, которое вы предоставили (поскольку я следую учебнику). Причина, по которой я задавалась вопросом, удалось ли создать проверку через цикл, заключалась в том, чтобы написать новый валидатор и автоматически включить его в составной_validator. Таким образом, вместо того, чтобы передавать новый валидатор в params составного валидатора каждый раз, когда я пишу новый, я могу запустить функцию loadValidators, которая мгновенно запускает все валидаторы, добавляет их в список, а затем передает этот список параметрам составного_литератора. – user2085143

+0

Или это ужасная идея? поэтому вместо составного_validator (новый v1(), новый v2(), новый v3() и т. д.), я мог бы просто загрузить loadValidators(), а затем составной_validator (person). – user2085143

+0

Я бы пошел с 'composite_validator (новый v1(), новый v2(), новый v3() и т. Д.)'. Вот как вы создаете свое приложение в [Корневой состав] (http://blog.ploeh.dk/2011/07/28/CompositionRoot/) –