首页 > 解决方案 > 如何存储来自通用对象的验证器列表。C#

问题描述

我正在为我的 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 MyInputToValidate {
    public Guid Id {get;set;}
    public string Name {get;set;}
    public string Description {get;set;}
}

从控制器

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

        //...
    }
}

但是我很难将验证器保存到字典中以备后用。

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

        //...
    }
}

我收到该IValidator<TProperty> is not assignable to to IValidator<object>行的错误_validators.Add(property.Name, validator);。我尝试过类型转换(IValidator<object>validator),但收到运行时错误Unable to cast object GuidValidator to type IValidator<object>。如何存储通用对象属性的验证器列表?

标签: c#validationuser-input

解决方案


推荐阅读