[英]C# expose events with properties
我需要使用其他類的屬性公開類實例的事件。
如果我公開在MyClass
定義的事件和在同一MyClass
定義的屬性,以便該事件像備用字段一樣工作,那么一切都很好:
private event EventHandler<EventArgs> _somethingHappened;
public EventHandler<EventArgs> SomethingHappened
{
get => _somethingHappened;
}
聽起來可能很奇怪,但是出於某些原因它可能很有用。
但是,如果我以相同的方式公開在AnotherClass
定義的事件,則可以通過該AnotherClass
的實例訪問該AnotherClass
,如下所示:
public EventHandler<EventArgs> SomethingStarted
{
get => Instance.Started;
}
其中Instance
是AnotherClass
的實例,而Instance.Started
在AnotherClass
定義如下:
public event EventHandler<EventArgs> Started;
然后我得到錯誤:“該事件只能出現在左側”。
我只是不明白為什么允許第一種情況而不允許第二種情況,盡管它們看起來非常相似。
我需要使用其他類的屬性公開類實例的事件。
您不應該以這種方式使用事件。 事件應始終作為event
公開。
您可以做的是通過您自己的班級公開其他班級的事件:
public event EventHandler<EventArgs> SomethingHappened
{
add => Instance.Started += value;
remove => Instance.Started -= value;
}
這樣,訂閱者將實際上訂閱Instance
的事件。 您可以將其包裝為方法,然后重新觸發事件以更改sender
。
事件既沒有getter也沒有setter,它們僅具有add
和remove
訪問器,因此不能用作屬性。
通過代碼get => Instance.Started
您嘗試獲取 Instance.Started
的值,但沒有獲取方法。
您可以做的是使SomethingStarted
成為一個事件,並覆蓋add
和remove
訪問器,以將值轉發到Instance.Started
事件:
public event EventHandler<EventArgs> SomethingStarted
{
add => Instance.Started += value;
remove => Instance.Started -= value;
}
這樣,對SomethingStarted
任何預訂將被“重定向”到Instance.Started
而不會導致事件被重新激發 。
在內部,這將被翻譯為:
public void add_SomethingStarted(EventHandler<EventArgs> eventHandler) {
Instance.add_Started(eventHandler);
}
public void remove_SomethingStarted(EventHandler<EventArgs> eventHandler) {
Instance.remove_Started(eventHandler);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.