Один из распространенных подходов (если вы владеете 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
.
Вы можете использовать дженерики в вышеприведенном - но это обычно создает больше проблем, чем решает в примере, подобном этому.