C# 铸造和类型问题

C# 铸造和类型问题,c#,inheritance,casting,overloading,C#,Inheritance,Casting,Overloading,我在应用程序中冒泡事件,因此使用冒泡事件方法。由于此方法处理所有类型的冒泡事件,因此它们是一个switch或if语句,用于确定我们处理的是哪种类型的事件。我想知道是否可以通过创建不同版本的event args类来解决这个问题。让我解释一下,假设我有两种不同处理的事件类型,称为X和Y,我为这两个事件创建了新的事件args类,因为它们存储不同类型的信息 public class EventsArgsX : EventsArgs public class EventsArgsY : EventsAr

我在应用程序中冒泡事件,因此使用冒泡事件方法。由于此方法处理所有类型的冒泡事件,因此它们是一个switch或if语句,用于确定我们处理的是哪种类型的事件。我想知道是否可以通过创建不同版本的event args类来解决这个问题。让我解释一下,假设我有两种不同处理的事件类型,称为X和Y,我为这两个事件创建了新的事件args类,因为它们存储不同类型的信息

public class EventsArgsX : EventsArgs

public class EventsArgsY : EventsArgs
然后,当我从应用程序中的某个地方引发BubbleEvent时,我可以传递两种基于事件参数的类型中的任何一种,因此

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

然后OnBubbleEvent方法会选择这个,谁的签名是 重写OnBubbleEvent(对象源,事件参数e)

首先,我不能重载这个方法,因为它被重写了,所以我想我可以做的是让另一个方法中有重载来处理这个问题,所以

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

private void DoStuff(EventArgsY args)
{}

private void DoStuff(EventArgsX args)
{}
当然,问题是OnBubbleEvent方法中的EventArgs e在调用时属于EventArgs类型。然而,我们知道它不是。那么,为了让方法调用正常工作,我该如何将其装箱回其实际类型呢

非常感谢,希望你能在这方面帮助我,这看起来真的很容易,就像a可能遗漏了什么或者它就是做不到一样

有什么想法吗?

很简单:

protected override OnBubbleEvent(object source, EventArgs e)
{
    if(e is EventArgsX)
        DoStuff((EventArgsX)e);
    else if(e is EventArgsY)
        DoStuff((EventArgsY)e);
}
这就是吻,不是很容易扩展。如果您计划添加更多事件类型,可以尝试:


我想我还不明白。为什么你不能写两个关于BubbleEvent的方法呢?你可以重写一个被重写的方法?!
protected override OnBubbleEvent(object source, EventArgs e)
{
    if(e is EventArgsX)
        DoStuff((EventArgsX)e);
    else if(e is EventArgsY)
        DoStuff((EventArgsY)e);
}
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);
    }
}