簡體   English   中英

C#公開具有屬性的事件

[英]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;
}

其中InstanceAnotherClass的實例,而Instance.StartedAnotherClass定義如下:

public event EventHandler<EventArgs> Started;

然后我得到錯誤:“該事件只能出現在左側”。

我只是不明白為什么允許第一種情況而不允許第二種情況,盡管它們看起來非常相似。

我需要使用其他類的屬性公開類實例的事件。

您不應該以這種方式使用事件。 事件應始終作為event公開。
您可以做的是通過您自己的班級公開其他班級的事件:

public event EventHandler<EventArgs> SomethingHappened
{
    add => Instance.Started += value;
    remove => Instance.Started -= value;
}

這樣,訂閱者將實際上訂閱Instance的事件。 您可以將其包裝為方法,然后重新觸發事件以更改sender

事件既沒有getter也沒有setter,它們僅具有addremove訪問器,因此不能用作屬性。

通過代碼get => Instance.Started您嘗試獲取 Instance.Started的值,但沒有獲取方法。

您可以做的是使SomethingStarted成為一個事件,並覆蓋addremove訪問器,以將值轉發到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM