1

我有一个有趣的场景,我构建了一个验证检查系统,该系统以表单的形式维护一系列要求,List<Tuple<Func<bool>, string>>如果验证失败,Func 应该返回 true,否则返回 false。该字符串是一个相应的拒绝描述,描述了测试失败的条件。

在如下更简单的测试中,验证系统非常简单:

validationChecks.Add(Tuple.Create<Func<bool>, string>(() => 
    value1 == requiredValue, "value 1 did not have the required value"));

在更高级的场景中,我正在努力理解 Func 的 lambda 中的变量范围,在该场景中,拒绝字符串是在对系统另一部分的调用中计算出来的。场景如下所示:

string rejectionString = null;
validationChecks.Add(Tuple.Create<Func<bool>, string>(() => {
    rejectionString = CallToAnotherMethodThatReturnsString(parameter);
    if (rejectionString != null) {
        return true;
    } else {
        return false;
    }
}, rejectionString));

编辑:通过测试观察到,当此检查失败时,元组中的拒绝字符串仍然为空。我希望使用由 CallToAnotherMethod 生成的拒绝字符串,有什么方法可以使用 ref 或其他方式来做到这一点?我需要 Func 的代码能够影响 Tuple 的 Item2 内的字符串的值。

问题是其中的代码CallToAnotherMethodThatReturnsString可能是我只想执行一次的代码。但是,如果检查失败,我想使用从它返回的字符串作为我在元组中的拒绝描述。在这一点上,我无法判断我rejectionString在第二个示例中使用的效果会达到什么效果?Tuple 中的rejectionString 是否总是为空?或者如果CallToAnotherMethodThatReturnsString返回不同的值,它会被更新吗?

4

1 回答 1

1

只是一个可行的想法。我认为,如果您将第二个 Tuple 参数更改为返回字符串而不是字符串值的 Func,您可能会接近您的需要。

string rejectionString = null;
validationChecks.Add(Tuple.Create<Func<bool>, Func<string>>(() =>
{
     rejectionString = CallToAnotherMethodThatReturnsString(parameter);
     if (rejectionString != null) {
      return true;
     } else {return false;}
 }, 
 ()=>rejectionString));

在第一种情况下,您的验证检查将设置为

validationChecks.Add(Tuple.Create<Func<bool>, Func<string>>(() => value1 == requiredValue, ()=>"value 1 did not have the required value"));

然后你的验证是逻辑

if(validationChecks[0].Item1()==false)
 var error = validationChecks[0].Item2(); 
于 2013-05-16T15:19:37.017 回答