如何将一个函数及其对象引用传递给另一个要执行的函数

How to pass a function with it's object reference to another function to execute

我想这是我想做的一件相当简单的事情,但我可能在这里遗漏了一些东西。

说我有几个函数都做 几乎 相同的事情除了一行,这肯定需要一个 "base" 函数或类似的东西, ONE 不同的行将传递给它并执行,其余代码将继续它的流程。

这是我的例子:

假设我有几个函数对 Car 对象执行操作并验证操作是否成功:

public void SoundHorn()
{
            var response = _car.Horn(1000);
            if(response.Status != 0)
            {
                throw new Exception("Operation failed!");
            }
}

public void TurnOnHazardLights()
{
            var response = _car.ToggleHazards(true);
            if(response.Status != 0)
            {
                throw new Exception("Operation failed!");
            }
}

如您所见,唯一的区别是要执行的实际功能,所有功能的验证都是相同的。

我最终想要的是有一个 "base" 函数沿着这些线:

private void PerformOperation(??? operation)
{
            var response = operation.Invoke();
            if(response.Status != 0)
            {
                throw new Exception("Operation failed!");
            }
}

所以其他函数看起来像:

public void TurnOnHazarLights()
    {
                PerformOperation(_car.togglehazards);
    }

我知道 Delegates、Actions 和 Func,它们似乎要求我将 Function 传递给 运行 本身,没有它的对象引用,我无法使用上面的语法。

我想我错过了上面提到的其中一个的用法 类。

能否请您赐教?

谢谢!

这将是

 private void PerformOperation(Func<int> operation)

你定义

 public void TurnOnHazarLights() => PerformOperation(()=>_car.ToggleHazards(true));
 public void SoundHorn() => PerformOperation(() => m_car.SoundHorn(100))

或将 < int > 替换为您的响应类型 class。

代表正是您所需要的。在这种情况下,由于所有操作都对 Car 对象和 return 对象进行操作,因此您需要一个 Func<Car, Something>,其中 SomethingHorn 的类型和其他人 return:

private void PerformOperation(Func<Car, Something> operation)
{
        var response = operation.Invoke(_car);
        if(response.Status != 0)
        {
            throw new Exception("Operation failed!");
        }
}

你可以这样写两个专门的操作:

public void SoundHorn()
{
    PerformOperation(car => car.Horn(1000));
}

public void TurnOnHazardLights()
{
    PerformOperation(car => car.ToggleHazards(true));
}

也许我正在监督一些事情,但为什么那行不通:

private void PerformOperation(Func<Response> operation)
{
            var response = operation();
            if(response.Status != 0)
            {
                throw new Exception("Operation failed!");
            }
}

然后您可以通过

调用它
PerformOperation(() => _car.ToggleHazards(true));