我有一个有趣的场景,我构建了一个验证检查系统,该系统以表单的形式维护一系列要求,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
返回不同的值,它会被更新吗?