将相关类传递给公共事件处理程序

时间:2017-08-24 13:54:33

标签: c# event-handling

我有几个派生自基类的类

public interface IBase {}
public class Base : IBase {}

public class ClassA : Base, IBase {}
public class ClassB : Base, IBase {}
public class ClassC : Base, IBase {}

现在我想通过事件处理程序将每个类的实例发送到一个公共位置,所以我想"很好......我只是从{{1}继承Base并将我的每个实例传递给一个可以将其发送出去的常用方法。 (请注意,以下内容不是真正的代码)

EventArgs

除了public interface IBase : IEventArgs public class Base : EventArgs, IBase {} public class ClassA : Base, IBase {} public class ClassB : Base, IBase {} public class ClassC : Base, IBase {} EventHandler Update; void SendClass(IEventArgs data) { Update?.Invoke(this,data); } .. SendClass(new ClassA()); SendClass(new ClassB()); SendClass(new ClassC()); 显然是我想象中的一个虚构。所以这不可能做到。

看起来唯一有效的解决方案是为我要发送的每个类定义一个海关IEventArgs方法。 EG:

Send

虽然这有效,但它给我一个糟糕的代码味道感觉,因为我基本上重复了一个非常简单的方法。

是否有其他设计可以通过假想的void SendClassA(ClassA data) { Update?.Invoke(this,data); } void SendClassB(ClassB data) { Update?.Invoke(this,data); } void SendClassC(ClassC data) { Update?.Invoke(this,data); } 实现我想要的效果?

我可以用一堆向上和向下投射来达到我想要的效果,但这也让我有一种不好的感觉(见Casting vs using the 'as' keyword in the CLR

2 个答案:

答案 0 :(得分:0)

这是你要找的吗?

public class BaseEventArgs : EventArgs {
    public IBase Data;
}

public event EventHandler<BaseEventArgs> Update;

void SendData(IBase data)
{
    Update?.Invoke(this, new BaseEventArgs { Data = data } );
}

答案 1 :(得分:0)

你可能想要这样的东西:

void Main()
{
    SendClass(new ClassA());
    SendClass(new ClassB());
    SendClass(new ClassC());
}

public class Base { }

public class ClassA : Base { }
public class ClassB : Base { }
public class ClassC : Base { }

public delegate void SendClassHandler(Base data);

public event SendClassHandler Update;

public void SendClass(Base data)
{
    Update?.Invoke(data);
}