如何存储来自泛型对象的验证程序列表。C#
我正在为我的API开发一个输入验证库如何存储来自泛型对象的验证程序列表。C#,c#,validation,user-input,C#,Validation,User Input,我正在为我的API开发一个输入验证库 interface IValidation<T>{ List<string> Errors(); bool Valid(T input); } class GuidValidator: IValidation<Guid> { bool Valid(Guid input){ ... } } class StringLengthValidator: IValidation<String>
interface IValidation<T>{
List<string> Errors();
bool Valid(T input);
}
class GuidValidator: IValidation<Guid> {
bool Valid(Guid input){ ... }
}
class StringLengthValidator: IValidation<String> {
bool Valid(String input){ ... }
}
从控制器
class MyController {
public ActionResult Post([FromBody] MyInputToValidate body){
ValidatorCollection validators = new ValidatorCollection<MyInputToValidate>();
validators.AddValidator(i => i.Id, new GuidValidator());
validators.AddValidator(i => i.Name, new LengthValidator());
validators.AddValidator(i => i.Description, new LengthValidator());
bool valid = validators.Validate(body);
//...
}
}
类MyController{
公共行动结果公告([FromBody]MyInputToValidate body){
ValidatorCollection validators=新的ValidatorCollection();
AddValidator(i=>i.Id,新的GuidValidator());
AddValidator(i=>i.Name,newlengthValidator());
AddValidator(i=>i.Description,newlengthValidator());
bool valid=validators.Validate(body);
//...
}
}
但是我很难将验证器保存到字典中供以后使用
interface IValidatorCollection<T> {
void AddValidator<TProperty>(
Expression<Func<T, TProperty>> property,
IValidator<TProperty> validator
);
bool Validate(T value);
}
class ValidatorCollection: IValidatorCollection<T> {
private IDictionary<string, IValidator<object>> _validators = new Dictionary<string, IValidator<object>>();
public void AddValidator<TProperty>(Expression<Func<T, TProperty>> property, IValidator<TProperty> validator)
{
_validators.Add(property.Name, validator);
}
public bool Validate(T value)
{
foreach(var val in _validators){
bool valid = val.Value.Valid(value);
}
//...
}
}
interface-IValidatorCollection{
无效添加验证器(
表达式属性,
IValidator验证器
);
bool验证(T值);
}
类验证器集合:IValidatorCollection{
私有IDictionary_validators=新字典();
public void AddValidator(表达式属性,ivalidor验证器)
{
_添加(property.Name,validator);
}
公共bool验证(T值)
{
foreach(var val在校验器中){
bool valid=val.Value.valid(值);
}
//...
}
}
我收到行
\u validators.Add(property.Name,validator)的错误ivalidor不可分配给ivalidor
代码>。我尝试了类型转换(IValidatorvalidator)
,但收到运行时错误无法转换对象GuidValidator以键入IValidator
。如何存储泛型对象属性的验证器列表?查看您的代码,我相信您需要一组类型的验证器来解决问题。验证器用于TProperty
。也就是说,我无法将字符串
验证器直接附加到myInputOvalidate
对象。
interface IValidatorCollection<T> {
void AddValidator<TProperty>(
Expression<Func<T, TProperty>> property,
IValidator<TProperty> validator
);
bool Validate(T value);
}
class ValidatorCollection: IValidatorCollection<T> {
private IDictionary<string, IValidator<object>> _validators = new Dictionary<string, IValidator<object>>();
public void AddValidator<TProperty>(Expression<Func<T, TProperty>> property, IValidator<TProperty> validator)
{
_validators.Add(property.Name, validator);
}
public bool Validate(T value)
{
foreach(var val in _validators){
bool valid = val.Value.Valid(value);
}
//...
}
}