C# 具有自定义错误信号的条件行为

C# 具有自定义错误信号的条件行为,c#,.net,error-handling,C#,.net,Error Handling,我正在从事一个.NET项目,在这个项目中,团队决定避开异常惯例,转而使用自定义错误信号。在实践中,这个概念运行得很好,除了有一个令人讨厌的副作用:我发现自己在决定是否继续之前不断检查中间错误代码: var error = DoSomething(); if( !error.Success ) return error; return DoSomethingElse(); 我想做的事情如下: DoSomething().ReturnIfError(); return DoSometh

我正在从事一个.NET项目,在这个项目中,团队决定避开异常惯例,转而使用自定义错误信号。在实践中,这个概念运行得很好,除了有一个令人讨厌的副作用:我发现自己在决定是否继续之前不断检查中间错误代码:

var error = DoSomething();

if( !error.Success )
    return error;

return DoSomethingElse();
我想做的事情如下:

DoSomething().ReturnIfError();
return DoSomethingElse();

我知道一些语言,比如Ruby,支持“return if”构造——C#中有这样的东西吗,或者可以在扩展方法中执行此操作吗?

执行单个通用类来检查错误,并在整个代码中调用该类或静态方法。

执行单个通用类来检查错误,并在整个代码中调用该类或静态方法。

这不是可以巧妙入侵的使用扩展方法

在您给出的第二个示例中(使用理论方法链接),您将

  • 呼叫
    DoSomething
  • 如果
    DoSomething
    出错,请调用
    returnierror
  • 然后调用
    DoSomethingElse
您需要使用
return
关键字提前脱离方法块

假设这是您真正想要做的,那么下面的代码可以实现这一点(我不推荐!)

使用系统;
命名空间控制台应用程序6
{
公共静态类类实用程序
{
public static void CallOnError(此TIn值,函数fn,操作错误fn)
在哪里上课
{
如果(!fn(值))
{
误差fn(值);
}
}
}
公共类TestClass
{
公共bool FirstCall(bool值)
{
控制台。WriteLine(“第一次呼叫”);
返回值;
}
公开作废第二次调用()
{
控制台。WriteLine(“第二次呼叫”);
}
公共无效第三方调用()
{
控制台。WriteLine(“第三次呼叫”);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var testClass=新的testClass();
testClass.CallOnError(tc=>tc.FirstCall(false),
tc2=>tc2.SecondCall());
testClass.CallOnError(tc=>tc.FirstCall(true),
tc2=>tc2.SecondCall());
testClass.ThirdCall();
Console.ReadLine();
}
}
}

这不是可以用扩展方法巧妙地入侵的东西

在您给出的第二个示例中(使用理论方法链接),您将

  • 呼叫
    DoSomething
  • 如果
    DoSomething
    出错,请调用
    returnierror
  • 然后调用
    DoSomethingElse
您需要使用
return
关键字提前脱离方法块

假设这是您真正想要做的,那么下面的代码可以实现这一点(我不推荐!)

使用系统;
命名空间控制台应用程序6
{
公共静态类类实用程序
{
public static void CallOnError(此TIn值,函数fn,操作错误fn)
在哪里上课
{
如果(!fn(值))
{
误差fn(值);
}
}
}
公共类TestClass
{
公共bool FirstCall(bool值)
{
控制台。WriteLine(“第一次呼叫”);
返回值;
}
公开作废第二次调用()
{
控制台。WriteLine(“第二次呼叫”);
}
公共无效第三方调用()
{
控制台。WriteLine(“第三次呼叫”);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var testClass=新的testClass();
testClass.CallOnError(tc=>tc.FirstCall(false),
tc2=>tc2.SecondCall());
testClass.CallOnError(tc=>tc.FirstCall(true),
tc2=>tc2.SecondCall());
testClass.ThirdCall();
Console.ReadLine();
}
}
}

您的意思是返回要运行的方法()还是返回MethodName.?。因为在您的案例中,var error将返回true或false。。如果我没有看错的话。。是否要返回要运行的方法?例如,如果要返回其自身的方法名。。查看此链接,它将有希望给你一个关于做什么和如何做的想法。。假设我正确地理解了你的问题。。这个例子相当做作。。。关键是,如果没有检测到错误,我想继续执行,而不仅仅是执行一个方法。您是说返回要运行的方法()还是MethodName..?。因为在您的情况下,var error将返回true或false。。如果我没有看错的话。。是否要返回要运行的方法?例如,如果要返回其自身的方法名。。查看此链接,它将有希望给你一个关于做什么和如何做的想法。。假设我正确地理解了你的问题。。这个例子相当做作。。。关键是,如果没有检测到错误,我想继续执行,而不仅仅是执行一个方法。我担心情况就是这样。谢谢你的意见。我恐怕是这样的。谢谢你的意见。
using System;

namespace ConsoleApplication6
{
    public static class ClassUtility
    {
        public static void CallOnError<TIn>(this TIn value, Func<TIn, bool> fn, Action<TIn> errorFn)
            where TIn : class
        {
            if (!fn(value))
            {
                errorFn(value);
            }
        }
    }

    public class TestClass
    {
        public bool FirstCall(bool value)
        {
            Console.WriteLine("First call.");
            return value;
        }

        public void SecondCall()
        {
            Console.WriteLine("Second call.");
        }

        public void ThirdCall()
        {
            Console.WriteLine("Third call.");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var testClass = new TestClass();

            testClass.CallOnError(tc => tc.FirstCall(false),
                                  tc2 => tc2.SecondCall());

            testClass.CallOnError(tc => tc.FirstCall(true),
                                  tc2 => tc2.SecondCall());

            testClass.ThirdCall();

            Console.ReadLine();
        }
    }
}