我在我的应用程序中冒泡事件,因此使用冒泡事件方法。由于此方法处理各种冒泡事件,因此它们是一个开关或其中的 if 语句来确定我们正在处理哪种事件。我想知道我是否可以通过创建事件参数类的不同版本来解决这个问题。所以让我解释一下,假设我有两种处理方式不同的事件,称为 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(object source, EventArgs e)
现在我不能重载这个方法,因为它首先被重写了,所以我想我可以做的是用另一种方法重载来处理这个,所以
protected override OnBubbleEvent(object source, EventArgs e)
{
DoStuff(e);
}
private void DoStuff(EventArgsY args)
{}
private void DoStuff(EventArgsX args)
{}
但是问题当然是OnBubbleEvent方法中的EventArgse在调用的时候是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/