Сохранить строку после возвращения из нескольких подключенных событий в C # - PullRequest
0 голосов
/ 27 декабря 2011

Я не был уверен, как Google для этого, так что это может быть глупый вопрос, но я все равно задам его.

У меня есть событие, которое хочет, чтобы делегаты возвращали строку.

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

Когда несколько методов делегата подключены к событию, как я могу предотвратить переопределение одним методом вывода другого? Я хочу только вывод метода, который возвращает строку, а не значение NULL. Есть ли способ достичь этого или это просто невозможно? Спасибо!

Edit: Примерная ситуация была бы такой:

        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 ]

1 голос
/ 27 декабря 2011

Без вынесения суждения о вашем дизайне.Это возможно сделать.Вам нужно перебрать подписчиков на событие 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;
   }
1 голос
/ 27 декабря 2011

бессмысленно возвращать что-либо, кроме void, из обработчика событий, именно по той причине, которая указана в вашем вопросе.Вы должны изменить свою модель.делегат должен вернуть void, и должен быть какой-то другой механизм для обработки строки, полученной в результате обработки сообщения.возможно, просто метод класса, который вызывает событие.

...