C# 从操作内部的父方法返回<;字符串>;

C# 从操作内部的父方法返回<;字符串>;,c#,delegates,C#,Delegates,我在一个方法中工作,该方法执行一系列验证检查,如果其中任何一个检查失败,它将调用操作来运行一些常见的拒绝代码。设置与此类似: public void ValidationMethod() { Action<string> rejectionRoutine = (rejectionDescription) => { // do something with the reject description // other common cod

我在一个方法中工作,该方法执行一系列验证检查,如果其中任何一个检查失败,它将调用
操作
来运行一些常见的拒绝代码。设置与此类似:

public void ValidationMethod() {
    Action<string> rejectionRoutine = (rejectionDescription) => {
        // do something with the reject description
        // other common code
    };

    if (condition != requiredValue) {
        rejectionRoutine("Condition check failed");
        // I currently have to put `return` here following every failed check
    }

    // many more checks following this
}
public void ValidationMethod(){
操作拒绝例程=(拒绝描述)=>{
//对拒绝描述做些什么
//其他通用代码
};
如果(条件!=要求值){
拒绝例行程序(“条件检查失败”);
//每次检查失败后,我现在必须在这里写上“return”
}
//接下来还有更多的检查
}
在这个系统中,一旦一个检查没有通过验证,我就不需要验证其余的,我只想在操作中运行公共拒绝代码并退出该方法。目前,我只需在调用
拒绝例程
后的下一行返回
。我想知道是否有一种方法可以从
操作
中合并返回或终止父方法执行的功能


我知道这有点吹毛求疵,但我觉得如果其他人需要添加额外的验证检查(他们不必担心将返回放得到处都是),那么扩展性就更好了以及将结束执行的常见行为封装在这些情况下常见的代码中

在lambda表达式中从调用方方法返回没有任何意义。
(如果在方法运行完成后调用它会怎么样?)

相反,您可以将其更改为
Func
,并返回其值:

return rejectionRoutine("Condition check failed");

作为SLaks解决方案的替代方案,如果您的设计允许,您还可以在您的
拒绝例程中抛出异常。

稍微清理代码的一种方法是将所有签出推断到集合中:

Dictionary<Func<bool>, string> checks = new Dictionary<Func<bool>, string>()
{
    {()=> condition != requiredValue, "Condition check failed"},
    {()=> otherCondition != otherRequiredValue, "Other condition check failed"},
    {()=> thirdCondition != thirdRequiredValue, "Third condition check failed"},
};

该操作位于该方法的本地内部,因此如果该方法运行完毕,我不知道如何调用它?如果我从Func返回了一些东西,那么在每次检查之后,我仍然必须执行If(returnValue==something)返回。还是我在这种方法中遗漏了什么?@JesseCarter:没有什么可以阻止你将委托暴露在方法之外。我不确定你的意思。我在问题中编辑了代码示例,该操作只存在于周围验证方法的范围内。我看不出除了该方法内部之外,它如何在任何地方被调用。不幸的是,对于您的新代码示例,@SLaks解决方案将无法工作,因为该方法没有返回值。不幸的是,我认为抛出异常不适合当前的设计。感谢您的想法,异常不应用于正常的控制流;它们应该用于特殊情况。我的想法非常保守,我相信如果我尝试这样做,这将是我代码审查的共识是的,这就是为什么我说“如果您的设计允许的话”。我不清楚你支票上的条件是否有理由抛出异常。啊,天哪,伟人都这么想。我写的代码与此几乎相同,但我发现有几个地方没有意义。有些检查如果在以前的检查应该终止时对其进行评估,则会引发异常。即,检查1是值!=null,check2可能会对值执行一些操作,假设我们得到这个值时它不能为nullfar@JesseCarter然后,正如我在最后所说的,您需要使用
列表
。这只是多一点代码。也许我对Func中bool的求值方式感到困惑?bool值的实际计算是否推迟到调用Func之后?我假设它将在Func创建后立即进行计算
bool值的实际计算是否推迟到调用Func时进行?
是的,是的<代码>我假设它会在Func创建后立即进行评估。
不,不会。谢谢,我没有意识到它会以这种方式运行,很高兴知道
var checks = new List<Tuple<Func<bool>, string>>()
{
    Tuple.Create<Func<bool>, string>(()=> condition != requiredValue
        , "Condition check failed"),
    Tuple.Create<Func<bool>, string>(()=> otherCondition != otherRequiredValue
        , "Other condition check failed"),
    Tuple.Create<Func<bool>, string>(()=> thirdCondition != thirdRequiredValue
        , "Third condition check failed"),
};
var failedCheck = checks.FirstOrDefault(check => check.Item1());
if (failedCheck != null)
    rejectionRoutine(failedCheck.Item2);