我有以下场景:
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;
解决方法
这确实是不允许的.如果我可以推荐一种替代方法:
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作为变量的类型或基类调用事件时,您将得到意外的结果.
原文地址:https://www.jb51.cc/csharp/97171.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。