如何使用参数和 Return 值创建 FUNC 动作列表

How to create FUNC Action List with Parameters and Return Values

我正在尝试创建我的第一个操作列表,我将能够在传递的对象中检查状态。

但我无法让它工作 - 它在 return 类型上给我一个错误。但是如果我将 return 类型更改为它想要的类型 - 那么我就无法向下传递值。

示例代码:

public class Class1
{
    public Main()
    {
        var decisionObject = new DecisionObject();

        var decisionList = new List<Func<DecisionObject, DecisionObject>>
        {
            Method1(decisionObject),
            Method2(decisionObject),
            Method3(decisionObject)
        };

        var exitLoop = false;

        foreach (var method in decisionList)
        {
            decisionObject = method(decisionObject);


            switch (decisionObject.Status)
            {
                case Status1:
                    exitLoop = true;
                    break;
                case Status2:
                case Status3:
                case Status4:
                    break;
            }

            if (exitLoop) break;
        }
     }  


 public Func<DecisionObject, DecisionObject> Method1(DecisionObject 
 decisionObject)
 {
     decisionObject = SomeOtherMethod(decisionObject);

     return decisionObject;
 }   


 }

我在这里错过了什么?

decisionObject = SomeOtherMethod(decisionObject)

可能不是返回一个函数,而是一个值。

你可以这样做:

public Func<DecisionObject, DecisionObject> Method1()
{
    var myFunc = (myObject) => SomeOtherMethod(myObject);
    return myFunc;
}

这将创建并 returns 一个需要一个参数并调用 SomeOtherMethod 的新函数。

请注意,此方法不需要 Method1 的参数,因此我将其删除。

如果我没记错的话,Method1Method2Method3 只是应该接受一个决策对象,而 return 是一个不同的对象。所以它们会像这样定义(希望这对你来说很简单):

DecisionObject Method1(DecisionObject input)
{
    var output = SomeMethod(input);
    return output;
}

然后您想将所有这些方法放入一个列表中并执行它们。要将它们放入列表中,请将方法名称放在代码 中,不带括号 。这告诉 C# 您需要对方法本身的引用,而不是调用方法的结果。

var decisionList = new List<Func<DecisionObject, DecisionObject>>
    {
        Method1,  //Do not invoke-- just store a reference to the method
        Method2,
        Method3
    };

然后您可以通过传递决策对象来调用它们:

foreach (var func in decisionList)
{
    var result = func(decisionObject);
}

这里要记住的关键是 当您在符号后加上括号时,它会告诉 C# 调用它。因此,如果您想要的只是对方法本身的引用,请不要加括号。