Вопрос о кастингах и типах - PullRequest
2 голосов
/ 22 января 2010

В моем приложении происходят пузырьковые события, поэтому я использую метод пузырьковых событий. Поскольку этот метод обрабатывает всевозможные всплывающие события, он является переключателем или оператором if внутри него, чтобы определить, с каким типом события мы имеем дело. Мне было интересно, смогу ли я обойти это, создав различные версии класса args события. Итак, позвольте мне объяснить, скажем, у меня есть два типа событий, которые обрабатываются по-разному, называемые X и Y, я создаю новые классы аргументов событий для этих двух событий, поскольку они хранят различные типы информации.

public class EventsArgsX : EventsArgs

public class EventsArgsY : EventsArgs

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

EventArgsX foox = new EventArgsX();
RaiseBubbleEvent(null,foox);

или

EventArgsY fooy = new EventArgsY();
RaiseBubbleEvent(null,fooy);

тогда метод OnBubbleEvent подхватывает это, чья подпись переопределить OnBubbleEvent (источник объекта, EventArgs e)

Теперь я не могу перегрузить этот метод, так как он переопределен в первую очередь, так что я подумал, что мог бы сделать, чтобы у меня был другой метод с перегрузками, чтобы справиться с этим, поэтому

protected override OnBubbleEvent(object source, EventArgs e)
{
    DoStuff(e);
}

private void DoStuff(EventArgsY args)
{}

private void DoStuff(EventArgsX args)
{}

но, конечно, проблема в том, что EventArgs e в методе OnBubbleEvent имеет тип EventArgs во время вызова. Однако мы знаем, что нет. Так как же мне вернуть его к фактическому типу, чтобы вызов метода работал?

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

есть идеи ??

1 Ответ

1 голос
/ 22 января 2010

Все просто:

protected override OnBubbleEvent(object source, EventArgs e)
{
    if(e is EventArgsX)
        DoStuff((EventArgsX)e);
    else if(e is EventArgsY)
        DoStuff((EventArgsY)e);
}

Это, будучи KISS, не очень расширяемо. Если вы планируете добавить больше типов событий, вы можете попробовать двойная отправка :

public abstract class EventArgsBase : EventArgs
{
    public abstract void Bubble(IEventBubbler eb);        
}

public interface IEventBubbler
{
    Bubble(EventArgsX ex);

    Bubble(EventArgsY ey);
}

public class EventArgsX : EventArgsBase
{
    public virtual void Bubble(IEventBubbler eb)
    {
        eb.Bubble(this);
    }
}

public class EventArgsY : EventArgsBase
{
    public virtual void Bubble(IEventBubbler eb)
    {
        eb.Bubble(this);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...