如何将一个函数及其对象引用传递给另一个要执行的函数
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>
,其中 Something
是 Horn
的类型和其他人 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));
我想这是我想做的一件相当简单的事情,但我可能在这里遗漏了一些东西。
说我有几个函数都做 几乎 相同的事情除了一行,这肯定需要一个 "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>
,其中 Something
是 Horn
的类型和其他人 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));