lambda中字符串的范围

kaut 发布于 4 天前 c# 最后更新 4 天前 2 浏览

我有一个有趣的场景,我构建了一个验证检查系统,以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));
编辑:正如通过测试所观察到的,当此检查失败时,Tuple的rejectString仍然为空。我想要使​​用由CallToAnotherMethod生成的rejectString来代替,有没有什么办法可以使用ref或其他方式来做到这一点?我需要Func的代码能够影响Tuple的Item2内的字符串的值。 问题在于CallToAnotherMethodThatReturnsString中的代码可能是我只想执行一次的代码。但是,如果检查失败,我想使用从它返回的字符串作为我在Tuple中的拒绝描述。目前我无法告诉我在第二个示例中使用rejectionString会产生什么效果? Tuple中的rejectString是否总是为空?或者如果CallToAnotherMethodThatReturnsString返回一个不同的值,它会被更新吗?
已邀请:

isit

赞同来自:

只是一个可能有效的想法。我想如果你将你的第二个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();