C#:引发一个inheritance的事件

我有一个包含以下事件的基类:

public event EventHandler Loading; public event EventHandler Finished; 

在从这个基类inheritance的类中,我试图提出这个事件:

 this.Loading(this, new EventHandler()); // All we care about is which object is loading. 

我收到以下错误:

事件“BaseClass.Loading”只能出现在+ =或 – =(BaseClass)的左侧

我假设我不能像其他遗传成员一样访问这些事件?

你需要做的是这样的:

在您的基类(您已声明事件的地方)中,创build可用于引发事件的受保护方法:

 public class MyClass { public event EventHandler Loading; public event EventHandler Finished; protected virtual void OnLoading(EventArgs e) { EventHandler handler = Loading; if( handler != null ) { handler(this, e); } } protected virtual void OnFinished(EventArgs e) { EventHandler handler = Finished; if( handler != null ) { handler(this, e); } } } 

(请注意,您可能应该更改这些方法,以检查是否必须调用事件处理程序)。

然后,在从这个基类inheritance的类中,可以调用OnFinished或OnLoading方法来引发事件:

 public AnotherClass : MyClass { public void DoSomeStuff() { ... OnLoading(EventArgs.Empty); ... OnFinished(EventArgs.Empty); } } 

您只能访问声明类中的事件,因为.NET会在实际持有委托的场景后面创build私有实例variables。 这样做

 public event EventHandler MyPropertyChanged; 

实际上是这样做的;

 private EventHandler myPropertyChangedDelegate; public event EventHandler MyPropertyChanged { add { myPropertyChangedDelegate += value; } remove { myPropertyChangedDelegate -= value; } } 

这样做…

 MyPropertyChanged(this, EventArgs.Empty); 

其实这是…

 myPropertyChangedDelegate(this, EventArgs.Empty); 

所以你可以(显然)只能从声明类中访问私有委托实例variables。

惯例是在声明类中提供这样的东西。

 protected virtual void OnMyPropertyChanged(EventArgs e) { EventHandler invoker = MyPropertyChanged; if(invoker != null) invoker(this, e); } 

然后,您可以从该类中的任何位置或inheritance层次之下调用OnMyPropertyChanged(EventArgs.Empty)来调用该事件。

我假设我不能像其他遗传成员一样访问这些事件?

恰恰。 习惯上为基类中的每个事件提供一个受保护的函数OnXyzRaiseXyz ,以便从inheritance的类中引发。 例如:

 public event EventHandler Loading; protected virtual void OnLoading() { EventHandler handler = Loading; if (handler != null) handler(this, EventArgs.Empty); } 

在inheritance的类中调用:

 OnLoading(); 

你可以试试这个方法,它适用于我:

 public delegate void MyEventHaldler(object sender, EventArgs e); public class B { public virtual event MyEventHaldler MyEvent; protected override void OnChanged(EventArgs e) { if (MyEvent != null) MyEvent(this, e); } } public class D : B { public override event MyEventHaldler MyEvent; protected override void OnChanged(EventArgs e) { if (MyEvent != null) MyEvent(this, e); } }