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