2011-12-26 6 views
0

私はこの1つのためにどのようにGoogleにするのか分からなかったので、それはダムの質問かもしれませんが、とにかくそれを求めるつもりです。C#の複数のフックされたイベントから返された文字列を保持した後

デリゲートが文字列を返すようにするイベントがあります。複数のデリゲートメソッドがイベントにフックされている

public delegate string IncomingMessageHook(SpecialClasses.IncomingMessageData msg); 
public event IncomingMessageHook InComingMessage; 

、どのように私は他の出力を上書きする一つの方法を防ぐのですか? 私はNULL値ではなく、文字列を返すメソッドの出力のみを必要とします。 これを達成する方法はありますか、これは完全に不可能ですか? ありがとう!

編集: 例の状況は次のようになります:上記のコードでは

 public string NewMessage(string[] _message, System.Net.IPEndPoint RemoteIP) 
     { 

      if (InComingMessage != null) 
      { 
       string toreturn = InComingMessage(new SpecialClasses.IncomingMessageData(_message, RemoteIP)); 
       return toreturn; 
      } 
      else return null; 
     } 
//this calls the event and retrieves a string from it, then returns that. 


    static string Return_Null(OnyLib.SpecialClasses.IncomingMessageData msg) 
    { 
     return null; 
    } 
//This hooked method returns null. 


    static string Return_Something(OnyLib.SpecialClasses.IncomingMessageData msg) 
    { 
     return "Something!"; 
    } 
//this hooked method returns "Something!" 

、どのように私は()NewMessageを呼び出す場合それが戻りますことを確認してください「何かを!」 NULLではない?

+0

「出力したいだけ」とはどういう意味ですか?パブリックイベントハンドラが返すものを制御することはできません。このハンドラを使用している場所でコードを表示できますか? –

+0

私は、デリゲートがそれを要求してから何かを返さなければならないイベントにフックされた複数のメソッドがあることを意味しますが、それらはすべてONE以外のNULLを返します。私は何を意味するかを示すためにいくつかのコードを書き上げます。 – Alex

答えて

1

あなたのデザインを判断せずに。これを達成することが可能です。 サブクライバをInComingMessageイベントまで繰り返し、各デリゲートの呼び出しからの戻り値を確認する必要があります。次のコードはこれを示しています。

public delegate string IncomingMessageHook(int id); 
    public event IncomingMessageHook InComingMessage; 
    private string OnInComingMessage(int id) 
    { 
     IncomingMessageHook handler = null; 
     Delegate[] targets = null; 
     string result; 

     handler = InComingMessage; 
     if (handler != null) 
     { 
      targets = handler.GetInvocationList(); 
      foreach (Delegate target in targets) 
      { 
       try 
       { 
        handler = (IncomingMessageHook)target; 
        result = handler.Invoke(id); 
        if (!String.IsNullOrEmpty(result)) 
        { 
         break; 
        } 
       } 
       catch (Exception ex) 
       { 
       } 
      } 
     } 
     return result; 
    } 
+0

Ohey!このようなものがあることを願っていましたが、今ではすでに作業しているリストを使用していますが、これは元の質問に近づくので答えとしてマークします。ありがとう! – Alex

1

これは、イベントハンドラからvoid以外の何かを返すことは意味がありません。あなたの質問で強調表示された理由と同じです。モデルを再設計する必要があります。デリゲートはvoidを返し、メッセージを処理した結果の文字列を処理するための他のメカニズムが必要です。おそらくイベントを発生させるクラスのメソッドです。

+0

ダムニット、私はこれが出てくることを知っていた:Pまあ、私はちょうどクラスのいくつかのインスタンスでいくつかの文字列を設定します。ちょうどちょっとだけこれをもう少し上げておきますが、私はそれを約1時間で答えるとマークします。明確化のためにありがとう。 – Alex

関連する問題