我在应用程序中冒泡事件,因此使用了冒泡事件方法。由于此方法处理各种冒泡事件,因此它们是一个开关或其中的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/