CustomerValidator: AbstractValidator<Customer>
如果传递客户的实例,如何动态实例化上面的类? 同样的,如果我有:验证的思考
Cat c = new Cat();
我想动态调用实现
AbstractValidator<Cat>
CustomerValidator: AbstractValidator<Customer>
如果传递客户的实例,如何动态实例化上面的类? 同样的,如果我有:验证的思考
Cat c = new Cat();
我想动态调用实现
AbstractValidator<Cat>
一种常用的方法(如果您同时拥有Customer
和CustomerValidator
)类与类装饰类通过属性提供验证:
[Validator(typeof(CustomerValidator))]
public class Customer { }
请注意,您可能会发现它更容易工作仿制药之外,也许通过接口(注:没有方法等如下所示):
[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
或:
public interface IValidator { }
public class CustomerValidator : AbstractValidator<Customer> {}
public class AbstractValidator<T> : IValidator where T : class {}
然后通过反射获得正确的验证合适的IValidator
。
你可以在上面使用泛型 - 但它通常会产生比它在这个例子中解决更多的问题。
我建议你指的是由Imaar Spaanjaars提出了一个解决方案,他在一系列的他写了“N-Layered Web Applications with ASP.NET 3.5”的文章提供。该系列的Part 2具有完全符合您要求的解决方案。我已经在我的模型中成功实施了这个解决方案,并且它的工作非常完美。
这里的链接:
另请参阅Part 3其论述了先进的scenrio的验证。
血腥的辉煌...如果只有我可以投票more..Cheers。 – Schotime 2009-04-13 08:51:16