1

我需要一个验证器类来运行一系列验证方法,每个验证方法都返回一个错误代码。根据错误的严重程度,我可能想中止其余的验证。我可以在每次调用后检查返回的错误代码,而不执行剩余的验证,但这会给主要的“驾驶”例程增加很多重复的混乱。

所以,我编写了以下帮助程序来为我处理这个......

public IList<Error> ValidateSet(InputType input,
    params Func<InputType, IList<Error>>[] validations)
{
    var errors = new List<Error>();

    foreach (var validation in validations)
    {
        errors.AddRange(validation(input));

        if (AbortValidations(errors))
            break;
    }

    return errors;
}

这按以下方式调用,效果很好......

var errors = new List<Error>();

errors.AddRange(
    ValidateSet(input,
        ValidateX,
        ValidateY,
        ValidateZ)
);

我现在遇到的问题是,某些验证需要除 InputType 的一个参数之外的其他参数。

有什么办法可以保持同样有用的结构吗?请注意,我不能简单地传递每个验证的结果,因为如果较早的验证返回“中止”错误代码(验证加载数据,因此这是性能要求),我不想运行剩余的验证。

谢谢,约翰

4

2 回答 2

0

如果您在调用时知道附加参数,ValidateSet()那么您可以执行以下操作

ValidateSet(
    input,
    input_type => ValidateX(input_type, additional_param1),
    input_type => ValidateY(input_type, something2),
    ValidateZ
);
于 2012-05-29T22:57:28.430 回答
0

取决于这些其他参数是什么,但可能是一个结构

struct
{
  public InputType  Input {get;set;}
  public int OtherArgument {get;set;}
}

所以你的一个参数输入变成了一桶参数,其中一个是输入

于 2012-05-29T23:04:36.923 回答