我有一个有趣的场景,我已经构建了一个验证检查系统,它以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"));
我正在努力在更高级的情况下理解lambda中lambda中变量的范围,在这种情况下,拒绝字符串是在调用系统的另一部分时计算的。场景看起来像这样:
string rejectionString = null;
validationChecks.Add(Tuple.Create<Func<bool>, string>(() => {
rejectionString = CallToAnotherMethodThatReturnsString(parameter);
if (rejectionString != null) {
return true;
} else {
return false;
}
}, rejectionString));
编辑:通过测试观察,当此检查失败时,来自元组的rejectionString仍为空。我想要使用CallToAnotherMethod生成的rejectionString代替,有什么方法可以使用ref或其他方法来做到这一点?我需要Func的代码才能影响元组Item2中字符串的值。
问题是 CallToAnotherMethodThatReturnsString
内的代码可能是我只想执行ONCE的代码。但是如果检查失败,我想使用从它返回的字符串作为元组中的拒绝描述。我现在无法告诉我在第二个例子中使用rejectionString
的效果是什么?在元组中的rejectionString总是为空吗?或者如果CallToAnotherMethodThatReturnsString
返回不同的值,它会更新吗?
答案 0 :(得分: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();