链接方法和更改执行顺序

时间:2018-10-26 09:44:51

标签: c#

我有此代码:

CHANGE_WIFI_STATE

如何在Method1()中触发操作列表中所有操作的执行?我无法根据固定大小检查列表,因为列表中可以有任何数字?唯一可以确定的是DoStuff1将在那里。

链接顺序应该相同,所以我不能调用a.Method3()。Method2()。Method1()

基本上我希望能够做这样的事情:

    public class A
    {
    private List<Action> operations = new List<Action>();
    public A Method1()
    {
        //some code here
        operations.Add(DoStuff1);
        //some more code here
        return this;
    }

    public A Method2()
    {
        //some code here
        operations.Add(DoStuff2);
        //some more code here
        return this;
    }

    public A Method3()
    {
        //some code here
        operations.Add(DoStuff3);
        //some more code here
        return this;
    }

    private void DoStuff1() { }
    private void DoStuff2() { }
    private void DoStuff3() { }
}

a.Method1().Method2().Method3();

例如此处:http://dotween.demigiant.com/documentation.php

1 个答案:

答案 0 :(得分:0)

您的类型不需要知道/猜测。将Action实例添加到每个相关调用的列表中。让您的类/类型公开一个名为Execute的方法(选择一个适当的名称)。该调用将遍历动作列表(在这种情况下为相反的顺序)并执行它们。调用方负责调用该方法,就像调用方负责调用其他方法开始一样。

public class A
{
    private List<Action> operations = new List<Action>();
    public A Method1()
    {
        operations.Add(DoStuff1);
        return this;
    }

    public A Method2()
    {
        operations.Add(DoStuff2);
        return this;
    }

    public A Method3()
    {
        operations.Add(DoStuff3);
        return this;
    }

    public void Execute()
    {
        operations.Reverse();
        foreach(var operation in operations)
           operation();
        operations.Clear();
    }

    private void DoStuff1() { }
    private void DoStuff2() { }
    private void DoStuff3() { }
}

呼叫者

a.Method1().Method2().Method3().Execute();

a = a.Method1().Method2().Method3();
a.Execute();

a.Method1();
a.Method2();
a.Method3();
a.Execute();