首页 > 解决方案 > C#中的方法链

问题描述

说我有一些这样的代码

var addResult = GetAddResult(num1, num2);

var transformedResult = TransformResult(addResult );

if(CheckValidity(transformedResult))
{
    SendResult(transformedResult); 
}
else
{
    LogError(transformedResult);
}

我在很多地方都在写这样的代码。基本上它是一个函数调用,其中一个的返回值是另一个的输入。还有一些流量变化取决于一些条件检查。

有没有办法以更易读的方式写这个?

例如

ExecuteFlow.GetAddResult(num1,num2).TransformResult.CheckValidity.IfTrue.SendResult.IfFalse.LogError;

对此道歉更多的是概念上的澄清。但我想知道这种技术是否可行。

标签: c#

解决方案


我认为你可以做到这一点

//let's assume this is the type that GetAddResult method is returning.
public class MyAddResult { ... }

//let's say this is what method TransformResult is returning.
public class MyTransformResult { ... }

public static class MyFlow {
    public static MyTransformResult TransformResult(this MyAddResult src) {
        ....
    }

    public static void IfValid(this MyTransformResult src, Action<MyTransformResult> methodIfTrue, Action<MyTransformResult> methodIfFalse) {
        if( CheckValidity(src) )
          methodIfTrue(src);

        methodIfFalse(src);
    }
}

//In another place
public void SendResult(MyTransformResult m) { ... }

//In another place
public void LogError(MyTransformResult m) { ... }

用法将是:

GetAddResult(num1, num2).TransformResult().IfValid(SendResult, LogError);

推荐阅读