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