在方法中传递具有第一个参数预设的操作
本文关键字:参数 操作 第一个 方法 | 更新日期: 2023-09-27 18:18:43
我有一个处理消息(或命令(的方法。然而,mModuleSimulation是另一个类的实例,这个类做一些异步的事情,完成后它需要将结果发送到另一台计算机。类 mModuleSimulation 不知道如何发送,这就是为什么我用它发送我的 SendData 方法,以便它可以简单地调用该方法。
public void HandleMessage(ITCCommand command, string address)
{
mModuleSimulation.ExecuteReceived(SendData, command.Name, address);
}
internal void SendData(string command, string tcAddress)
{
//DoSend command to address stuff
}
现在不得不传递一种方法已经够糟糕的了(至少我认为这不是好的做法,可能是错误的(。但是这种方法 发送数据 需要一个地址才能发送到。正如您在示例中看到的那样,我目前正在发送地址。
后来当一切都完成后,我这样称呼它:
SendData.Invoke(message, address);
有没有办法(不更改 SendData 方法(只需要做:SendData.Invoke(message)
所以我不必在每个方法中传递地址。
是否可以像这样做(我知道这完全行不通,但这只是为了了解我在问什么(:
public void HandleMessage(ITCCommand command, string address)
{
Action<string, string> sendDataAction = this.SendData.**SetArgument(arg1 = address)**;
mModuleSimulation.ExecuteReceived(sendDataAction , command.Name);
}
传递
方法(或函数(非常好 - 它又回到了流行:)
在您的情况下,封盖是完美的解决方案。您的 SendData
方法需要两个参数,但您可以捕获参数,而不必手动传递它 - lambda 函数使这变得微不足道:
public void HandleMessage(ITCCommand command, string address)
{
mModuleSimulation.ExecuteReceived(cmd => SendData(cmd, address), command.Name);
}
internal void SendData(string command, string tcAddress)
{
//DoSend command to address stuff
}
这样,您传递的委托已经捕获了address
,并且它自己的签名只是Action<string>
。您从ExecuteReceived
方法中隐藏了SendData
方法的实现细节,老实说,该方法根本不在乎 - 它只是想调用Action<string>
.
如果这让你感到不安,只需想想委托的真正含义 - 在简单的 OOP 中,它是一个使用单个方法实现接口的类。你几乎无法得到比这更多的 OOP :D
这完全类似于手动执行以下操作:
interface ISendData
{
void SendData(string command);
}
class SendData : ISendData
{
private readonly string address;
public SendData(string address)
{
this.address = address;
}
public void SendData(string command)
{
InternalSendData(command, address);
}
}
public void HandleMessage(ITCCommand command, string address)
{
var mySendData = new SendData(address);
mModuleSimulation.ExecuteReceived(mySendData, command.Name);
}
您只需节省一些不必要的代码:)