从C#中的多个钩子事件返回后保留字符串

时间:2011-12-26 22:22:56

标签: c# .net string events

我不确定如何谷歌这个,所以这可能是一个愚蠢的问题,但无论如何我都会问它。

我有一个希望代理返回字符串的事件。

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()它将返回“Something!”而不是NULL?

2 个答案:

答案 0 :(得分:1)

这对于从事件处理程序返回除void之外的任何内容毫无意义,正是由于您的问题突出显示的原因。你应该重新设计你的模型。委托应返回void,并且应该有一些其他机制来处理因处理消息而产生的字符串。也许只是一个提升事件的类的方法。

答案 1 :(得分: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;
   }