c# - 转换和类型问题

标签 c# inheritance casting overloading

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

public class EventsArgsX : EventsArgs

public class EventsArgsY : EventsArgs


然后当我从应用程序中的某个地方发起RaiseBubbleEvent时,我可以传递基于两个事件arg的类型之一,所以..

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)
{}


但是,当然,问题在于调用时OnBubbleEvent方法中的EventArgs e是EventArgs类型。但是我们不知道。那么,为了使方法调用起作用,我如何将其恢复为实际类型?

非常感谢,希望您能为我提供帮助,这看起来真的很容易,例如可能缺少某些东西或无法完成

有任何想法吗??

最佳答案

这很简单:

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


作为KISS,这不是很可扩展。如果您打算添加更多事件类型,可以尝试double dispatch

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);
    }
}

关于c# - 转换和类型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2116850/

相关文章:

c# - 在类库中包含 View

c# - 我如何从 Asp.net 中的文本文件加载信息?

c++ - static_cast 限制对公共(public)成员函数的访问?

java - 我们是否需要始终扩展struts-default包?

java - ClassCastException 但仍然编译

c# - C#中的多线程加密

c# - 让 Outlook 识别我的数字签名电子邮件

c# - 从派生类中获取特定类型

javascript - 在 Chrome 扩展中使用 sendMessage 时 webkitMediaStream 对象类型丢失

java - 类型转换与追加