c# – 从基类调用事件

我有以下场景:
public abstract class SomeBaseClass
{
    public event EventHandler SomeEvent;

    ...
}

public class SomeClass : SomeBaseClass
{
    public void DoSomething()
    {
        //Todo

        if (SomeEvent != null)
            SomeEvent(this,EventArgs.Empty);
    }
}

SomeBaseClass有一个需要在基类中调用的事件,但是不可能直接从基类调用该事件.为了解决这个问题,我可以覆盖基类中的事件,如下所示:

public class SomeClass : SomeBaseClass
{
    new public event EventHandler SomeEvent;

我猜这很好,但我的问题是,是否存在某种通用方法或实施上述功能的良好实践?

事实上,不可能从基类调用事件表明我不应该首先这样做,也许调用事件的责任应该只在SomeBaseClass中?

解决方法

这确实是不允许的.如果我可以推荐一种替代方法
public abstract class SomeBaseClass
{
    public event EventHandler SomeEvent;

    protected void RaiseSomeEvent(EventArgs e)
    {
        var eh = SomeEvent;
        if (eh != null)
            eh(this,e);
    }
}

public class SomeClass : SomeBaseClass
{
    public void DoSomething()
    {
        //Todo
        RaiseSomeEvent(EventArgs.Empty);
    }
}

请注意,我已将事件处理程序的调用移动到拥有类,这是.NET / C#所必需的,因为只有该类可以调用事件处理程序.其次,我通过首先将它分配给eh来使事件处理程序线程安全.

永远不要使用new关键字隐藏基类的事件!当您使用基类’type作为变量的类型或基类调用事件时,您将得到意外的结果.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...