使用FluentValidation将lambda表达式作为方法参数传递

时间:2019-02-04 10:30:04

标签: c# lambda fluentvalidation

我正在使用FluentValidation对我的程序进行一些服务器端验证。为了利用一些自定义验证,我使用must验证器,该验证器允许您传入谓词并返回布尔值以测试验证是否成功。我正在尝试的验证涉及检查数组中是否存在字符串。

这些细节基本上无关紧要,因为我只需要能够将谓词与第二个string[]变量一起传递给方法。

以下是我的验证方法:

public bool StringInArray(Func<string> predicate, string[] testArray)
        {
            if(testArray.Contains(predicate.Invoke()))
            {
                return true;
            }

            return false;
        }

这是我调用此方法的地方。

RuleFor(p => p.Funder)
                .Must(StringInArray(p => p, funderStrings));

funderStrings是我正在检查的谁的内容的数组。 p.Funder是我要在数组内部检查的字符串。

p => p参数不正确,并且我收到Delegate 'Func<string>' does not take 1 argument编译错误。我不确定如何将字符串传递到StringInArray方法中。

1 个答案:

答案 0 :(得分:1)

您想要这个吗

    public bool StringInArray(Func<string, string> conversion, string[] testArray)
    {
        if (testArray.Any((s) => s.Equals(conversion(s))))
        {
            return true;
        }

        return false;
    }
    ...
    RuleFor(p => p.Funder).Must(() => StringInArray(p => p, funderStrings));

或者这个:

    public Func<bool> StringInArray(string s, string[] testArray)
    {
        return () => testArray.Contains(s);
    }
    ...
    RuleFor(p => p.Funder).Must(() => StringInArray(p => p, funderStrings));

请进一步详细说明您期望StringInArray方法执行的操作,Must方法接收并执行的操作