2009-04-13 62 views
1
CustomerValidator: AbstractValidator<Customer> 

如果传递客户的实例,如何动态实例化上面的类? 同样的,如果我有:验证的思考

Cat c = new Cat(); 

我想动态调用实现

AbstractValidator<Cat> 

回答

2

一种常用的方法(如果您同时拥有CustomerCustomerValidator)类与类装饰类通过属性提供验证:

[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

你可以在上面使用泛型 - 但它通常会产生比它在这个例子中解决更多的问题。

+0

血腥的辉煌...如果只有我可以投票more..Cheers。 – Schotime 2009-04-13 08:51:16

0

我建议你指的是由Imaar Spaanjaars提出了一个解决方案,他在一系列的他写了“N-Layered Web Applications with ASP.NET 3.5”的文章提供。该系列的Part 2具有完全符合您要求的解决方案。我已经在我的模型中成功实施了这个解决方案,并且它的工作非常完美。

这里的链接:

link text

另请参阅Part 3其论述了先进的scenrio的验证。