在方法中传递具有第一个参数预设的操作

本文关键字:参数 操作 第一个 方法 | 更新日期: 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);
}

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