2009-04-13 59 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的驗證。