8

我正在一个执行一系列验证检查的方法内部工作,如果这些检查中的任何一个失败,它都会调用一个Action<string>来运行一些常见的拒绝代码。设置类似于以下内容:

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
}

在这个系统中,一旦一个检查验证失败,我就不需要验证其余的,我只想在 Action 中运行常见的拒绝代码并退出该方法。目前要做到这一点,我只是return在调用rejectionRoutine. 我想知道是否有一种方法可以合并从内部返回或终止父方法执行的能力Action

我知道这有点挑剔,但我觉得如果其他人需要添加额外的验证检查(他们不必担心把 return 到处都是),那么它对未来的可扩展性会更好将结束执行的常见行为封装在这些情况下应该通用的代码中。

4

3 回答 3

7

稍微清理一下代码的一种方法是将所有检查外推到一个集合中:

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"},
};

如果以特定顺序运行检查很重要(此代码具有不可预测的顺序),那么您需要使用类似 a 的东西List<Tuple<Func<bool>, string>>

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"),
};

然后,您可以使用 LINQ 进行验证:

var failedCheck = checks.FirstOrDefault(check => check.Item1());
if (failedCheck != null)
    rejectionRoutine(failedCheck.Item2);
于 2013-05-14T14:05:20.387 回答
1

从 lambda 表达式中的调用者方法返回没有任何意义。
(如果你在方法完成运行后调用它呢?)

相反,您可以将其更改为 aFunc<string, Whatever>并返回其值:

return rejectionRoutine("Condition check failed");
于 2013-05-14T13:56:16.863 回答
0

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

于 2013-05-14T13:58:54.387 回答