Попробуйте это:
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);
Спасибо так много! Так что у меня очень похоже на второе решение, которое вы предоставили (поскольку я следую учебнику). Причина, по которой я задавалась вопросом, удалось ли создать проверку через цикл, заключалась в том, чтобы написать новый валидатор и автоматически включить его в составной_validator. Таким образом, вместо того, чтобы передавать новый валидатор в params составного валидатора каждый раз, когда я пишу новый, я могу запустить функцию loadValidators, которая мгновенно запускает все валидаторы, добавляет их в список, а затем передает этот список параметрам составного_литератора. – user2085143
Или это ужасная идея? поэтому вместо составного_validator (новый v1(), новый v2(), новый v3() и т. д.), я мог бы просто загрузить loadValidators(), а затем составной_validator (person). – user2085143
Я бы пошел с 'composite_validator (новый v1(), новый v2(), новый v3() и т. Д.)'. Вот как вы создаете свое приложение в [Корневой состав] (http://blog.ploeh.dk/2011/07/28/CompositionRoot/) –