我有一个处理消息(或命令)的方法。但是,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需要一个地址发送给。正如您在示例中所见,我目前正在向其发送地址。
稍后当一切都完成后我会这样称呼它:
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);
}
答案 0 :(得分:4)
传递方法(或功能)非常好 - 它重新流行:)
在您的情况下,封闭是完美的解决方案。你的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>
。您隐藏SendData
方法的实施详细信息,而ExecuteReceived
方法根本不关心 - 它只是想调用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);
}
你只需要节省一些不必要的代码:)