如何存储来自泛型对象的验证程序列表。C#

如何存储来自泛型对象的验证程序列表。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>

我正在为我的API开发一个输入验证库

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);
        }

        //...
    }
}