最初の引数がプリセットされたメソッドにアクションを渡す

ヴィンセント

メッセージ(またはコマンド)を処理するメソッドがあります。ただし、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);
}
ルアン

メソッド(または関数)を渡すことは完全に問題ありません-それは流行に戻っています:)

あなたの場合、クロージャは完璧な解決策です。あなたのSendData方法には2つの引数が必要ですが、あなたは、むしろそれを手動で合格することよりも、引数を取り込むことができます-ラムダ関数は、これは些細ます

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

不要なコードを少し節約するだけです:)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

NSTimerのメソッドに引数を渡すと、アプリがクラッシュします

分類Dev

Pythonでネストされたメソッドのオプションの引数を公開する

分類Dev

セッションがPOSTされたデータを2番目のスクリプトに渡さない-アドバイスしてください

分類Dev

Javascript:引数として渡されたオブジェクトのメソッドにパブリックメソッドへのアクセスを許可する

分類Dev

''セッション 'の定義が含まれておらず、タイプ'オブジェクト 'の最初の引数を受け入れる拡張メソッド' 'が見つかりませんでした

分類Dev

そのメソッドへの引数がコンパイル時にクラスパスにないクラスである場合、リフレクションを使用して宣言されたメソッドを取得する

分類Dev

メソッドにアクセスしてテンプレート内で引数を渡す方法は?

分類Dev

引数の数が不明なメソッドに渡された引数の数を取得します

分類Dev

メソッドに構築されたオプションの引数をarrayListに追加させる方法

分類Dev

ビューからアクションメソッドにテキストボックスの値を渡し、指定された条件でtruefalseを返します

分類Dev

ビューからアクションメソッドにテキストボックスの値を渡し、指定された条件でtruefalseを返します

分類Dev

ドロップダウンメニューからログアウトをクリックすると、セッション変数が破棄されます

分類Dev

デリゲートがジェネリック引数として渡されたときにC#デリゲートメソッドを呼び出す

分類Dev

ASP.NET Core MVC ChallengeResult、AuthenticationProperties引数がリダイレクトされたアクションメソッドで受信されない

分類Dev

パッケージ化された電子アプリケーションに引数を渡す

分類Dev

「タイプ」には「アセンブリ」の定義が含まれておらず、タイプ「タイプ」の最初の引数を受け入れる拡張メソッド「アセンブリ」が見つかりませんでした

分類Dev

オプションの引数とそれに続くキーワード引数のリストを使用したメソッドの処理

分類Dev

メソッド引数で暗黙的にアンラップされたオプションのクロージャ

分類Dev

選択したオプションをメソッドに渡し、データ属性にアクセスする

分類Dev

セットアップモックが正常に機能しない(実行されたリポジトリメソッドのnull値を返す)

分類Dev

Python3.xで引数として渡されたオブジェクトのメソッドにアクセスする方法

分類Dev

同じアプリケーションの別のデプロイメント(別のポート)をロードした後、セッションオブジェクトがリセットされます

分類Dev

メソッドの引数として指定されたジェネリックリストタイプでObservableを渡す

分類Dev

ラッパースクリプトに渡された最初の引数は無視されます

分類Dev

リフレクションを使用して、プレーンJavaのメソッドへの制限されたアクセスを完全に侵害します-なぜそれが可能ですか?

分類Dev

POSTリクエストがこのWebAPIアクションメソッドにマップされるのはなぜですか?

分類Dev

Fridaのフックされた関数に引数として渡されたJavaオブジェクトのメソッドを呼び出す

分類Dev

メソッドを呼び出すときに引数を渡す方法(リフレクション)?

分類Dev

クラスがプリミティブ型を参照している場合、ASMを介して生成されたクラスのコンストラクターにアクセスするすべてのリフレクションメソッドはNoClassDefFoundErrorをスローします

Related 関連記事

  1. 1

    NSTimerのメソッドに引数を渡すと、アプリがクラッシュします

  2. 2

    Pythonでネストされたメソッドのオプションの引数を公開する

  3. 3

    セッションがPOSTされたデータを2番目のスクリプトに渡さない-アドバイスしてください

  4. 4

    Javascript:引数として渡されたオブジェクトのメソッドにパブリックメソッドへのアクセスを許可する

  5. 5

    ''セッション 'の定義が含まれておらず、タイプ'オブジェクト 'の最初の引数を受け入れる拡張メソッド' 'が見つかりませんでした

  6. 6

    そのメソッドへの引数がコンパイル時にクラスパスにないクラスである場合、リフレクションを使用して宣言されたメソッドを取得する

  7. 7

    メソッドにアクセスしてテンプレート内で引数を渡す方法は?

  8. 8

    引数の数が不明なメソッドに渡された引数の数を取得します

  9. 9

    メソッドに構築されたオプションの引数をarrayListに追加させる方法

  10. 10

    ビューからアクションメソッドにテキストボックスの値を渡し、指定された条件でtruefalseを返します

  11. 11

    ビューからアクションメソッドにテキストボックスの値を渡し、指定された条件でtruefalseを返します

  12. 12

    ドロップダウンメニューからログアウトをクリックすると、セッション変数が破棄されます

  13. 13

    デリゲートがジェネリック引数として渡されたときにC#デリゲートメソッドを呼び出す

  14. 14

    ASP.NET Core MVC ChallengeResult、AuthenticationProperties引数がリダイレクトされたアクションメソッドで受信されない

  15. 15

    パッケージ化された電子アプリケーションに引数を渡す

  16. 16

    「タイプ」には「アセンブリ」の定義が含まれておらず、タイプ「タイプ」の最初の引数を受け入れる拡張メソッド「アセンブリ」が見つかりませんでした

  17. 17

    オプションの引数とそれに続くキーワード引数のリストを使用したメソッドの処理

  18. 18

    メソッド引数で暗黙的にアンラップされたオプションのクロージャ

  19. 19

    選択したオプションをメソッドに渡し、データ属性にアクセスする

  20. 20

    セットアップモックが正常に機能しない(実行されたリポジトリメソッドのnull値を返す)

  21. 21

    Python3.xで引数として渡されたオブジェクトのメソッドにアクセスする方法

  22. 22

    同じアプリケーションの別のデプロイメント(別のポート)をロードした後、セッションオブジェクトがリセットされます

  23. 23

    メソッドの引数として指定されたジェネリックリストタイプでObservableを渡す

  24. 24

    ラッパースクリプトに渡された最初の引数は無視されます

  25. 25

    リフレクションを使用して、プレーンJavaのメソッドへの制限されたアクセスを完全に侵害します-なぜそれが可能ですか?

  26. 26

    POSTリクエストがこのWebAPIアクションメソッドにマップされるのはなぜですか?

  27. 27

    Fridaのフックされた関数に引数として渡されたJavaオブジェクトのメソッドを呼び出す

  28. 28

    メソッドを呼び出すときに引数を渡す方法(リフレクション)?

  29. 29

    クラスがプリミティブ型を参照している場合、ASMを介して生成されたクラスのコンストラクターにアクセスするすべてのリフレクションメソッドはNoClassDefFoundErrorをスローします

ホットタグ

アーカイブ