C#中的方法链接

时间:2018-09-03 17:57:02

标签: 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;

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

3 个答案:

答案 0 :(得分:2)

我想你可以做到

//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);

答案 1 :(得分:1)

您可以编写C#扩展名,

例如

GetAddResult(num1, num2).Handle();

扩展名将为:

public static void Handle(this AddResult addResult)
{
    var transformedResult = TransformResult(addResult);

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

或更冗长:

GetAddResult(num1, num2).ToTransformResult().HandleValidity();

具有以下扩展名:

public static TransformResult ToTransformResult(this AddResult addResult)
{
    return TransformResult(addResult);
}

public static void HandleValidity(this TransformResult addResult)
{
    if(CheckValidity(transformedResult))
    {
        SendResult(transformedResult); 
    }
    else
    {
        LogError(transformedResult);
    }
}

不确定是否可以满足您的所有要求。

答案 2 :(得分:0)

Result.OfAdding(1, 2)
    .Transform()
    .IfValid(thenInvokeThis: () => Debug.Print("Valid"),
        elseInvokeThis: () => Debug.Print("Invalid"));

Dabbas解决方案有点曲折-IsValid的工作原理非常好,但是我觉得初始设置会更流畅。

首先声明一个公共接口和一个静态工厂。

interface IAddResult
{
    int AddendA { get; set; }
    int AddendB { get; set; }
    int Sum { get; }
}

static class Result
{
    public static IAddResult OfAdding(int a, int b)
    {
        // TODO: Return add result.
        throw new NotImplementedException();
    }
}

然后通过扩展添加链接功能。

static class AddResultExtensions
{
    public static IAddResult Transform(this IAddResult addResult)
    {
        // TODO: Transform add result.
        throw new NotImplementedException();
    }

    public static void IfValid(this IAddResult addResult, Action thenInvokeThis, 
        Action elseInvokeThis)
    {
        // TODO: Validate.
        bool isValid = true ? throw new NotImplementedException() 
            : false;

        if (isValid)
        {
            thenInvokeThis();
        }
        else
        {
            elseInvokeThis();
        }
    }
}