Отражение для проверки - PullRequest
1 голос
/ 13 апреля 2009
CustomerValidator: AbstractValidator<Customer>

Как можно динамически создать экземпляр класса выше, если передан экземпляр Customer? Точно так же, если бы у меня было:

Cat c = new Cat();

Я хотел бы динамически вызывать класс, который реализует

AbstractValidator<Cat>

Ответы [ 2 ]

2 голосов
/ 13 апреля 2009

Один из распространенных подходов (если вы владеете Customer и CustomerValidator) - это украсить класс тем классом, который обеспечивает проверку, через атрибут:

[Validator(typeof(CustomerValidator))]
public class Customer { }

Обратите внимание, что вам может быть проще работать вне обобщений, возможно, через интерфейс (примечание: здесь нет методов и т. Д.):

public interface IValidator { }
public class CustomerValidator : AbstractValidator<Customer> {}
public class AbstractValidator<T> : IValidator where T : class {}

Затем получите правильный валидатор с помощью отражения:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public sealed class ValidatorAttribute : Attribute
{
    public Type ValidatorType { get; private set; }
    public ValidatorAttribute(Type validatorType)
    {
        ValidatorType = validatorType;
    }
    public static IValidator GetValidator(object obj)
    {
        if (obj == null) return null;
        return GetValidator(obj.GetType());
    }
    public static IValidator GetValidator(Type type)
    {
        if (type == null) return null;
        ValidatorAttribute va = (ValidatorAttribute)
            Attribute.GetCustomAttribute(type, typeof(ValidatorAttribute));
        if (va == null || va.ValidatorType == null) return null;
        return (IValidator) Activator.CreateInstance(va.ValidatorType);
    }
}

Таким образом, вызов GetValidator должен вернуть null или подходящий IValidator.

Вы можете использовать дженерики в вышеприведенном - но это обычно создает больше проблем, чем решает в примере, подобном этому.

0 голосов
/ 13 апреля 2009

Я рекомендую вам обратиться к решению, предложенному Imaar Spaanjaars , которое он представил в серии статей, которые он написал для " N-Layered Web". Приложения с ASP.NET 3.5 ". Часть 2 серии имеет решение именно то, что вам нужно. Я успешно реализовал это решение в моей модели, и оно работает абсолютно идеально.

Вот ссылка:

текст ссылки

Также см. Часть 3 , в которой рассматриваются расширенные сценарии для валидаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...