使用第一个参数预设

时间:2015-10-21 11:47:17

标签: c#

我有一个处理消息(或命令)的方法。但是,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);
}

1 个答案:

答案 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);
}

你只需要节省一些不必要的代码:)