如何使用参数和 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 的参数,因此我将其删除。
如果我没记错的话,Method1
、Method2
和 Method3
只是应该接受一个决策对象,而 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# 调用它。因此,如果您想要的只是对方法本身的引用,请不要加括号。
我正在尝试创建我的第一个操作列表,我将能够在传递的对象中检查状态。
但我无法让它工作 - 它在 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 的参数,因此我将其删除。
如果我没记错的话,Method1
、Method2
和 Method3
只是应该接受一个决策对象,而 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# 调用它。因此,如果您想要的只是对方法本身的引用,请不要加括号。