Инкапсулирование события в метод? - PullRequest
0 голосов
/ 06 июня 2009

Допустим, я не могу изменить класс А.

У меня есть это в class A<T>, есть метод JumpNext():

public void JumpNext();

Запускает событие в class A<T>, которое называется Next

И это в моем классе B:

public T Next()
{
    instanceofA.JumpNext();
    //instanceofA.Next += something;
    // wait for event
    // someting(object sender, AEventArgs e)
    //return e.Entry
}

Проблема в том, что мой метод Next должен возвращать экземпляр T, содержащийся в поле Entry AEventArgs, возвращенном событием A.Next.

Так как я могу сделать это внутри одного метода в классе B?

Я использую .NET 2.0, но если это возможно только в любой более поздней версии, это также может подойти.

Ответы [ 3 ]

3 голосов
/ 06 июня 2009

Если я правильно понимаю ваш вопрос, вы хотите обработать событие A.Next внутри метода B.Next (). Вы можете сделать это с помощью анонимного метода, , но вы должны быть осторожны, чтобы не регистрировать обработчик событий более одного раза:

Скажем, следующее событие определено как делегат, объявленный следующим образом:

public delegate vote NextHandler(object sender, AEventArgs e);

вы могли бы сделать:

public T Next()
{
    T entry;
    NextHandler handler = delegate(object sender, AEventArgs e) {
        entry = e.entry;
    }

    instanceOfA.Next += handler;
    try {
        instanceOfA.JumpNext();
    } finally {
        instanceOfA -= handler;
    }

    return entry;
}
2 голосов
/ 06 июня 2009

Вы можете сделать что-то подобное:

    public void T Next()
    {
        T value = default(T);
        EventHandler<AEventArgs> handler = new EventHandler<AEventArgs>(delegate(object sender, AEventArgs e) { value = e.Entry; });
        instanceofA.Next += handler;
        instanceofA.JumpNext();
        instanceofA.Next -= handler;
        return value;
    }
0 голосов
/ 06 июня 2009

Я сделал комбинацию из двух:

public T Next()
{
    T entry = default(T);
    EventHandler<AEventArgs> handler = delegate(object sender, AEventArgs e)
    { 
        entry = e.Entry; 
    };
    instanceofA.Next+= handler;
    try
    {
        instanceofA.JumpNext();
    }
    finally
    {
        instanceofA.Next-= handler;
    }
    return entry;
}
...