簡體   English   中英

訂閱可為空類的事件

[英]Subscribe to events of a nullable class

我正在訂閱由類生成的事件,該事件可能為null,如下所示:

if (eventGeneratingClass != null)
  eventGeneratingClass.myEvent += myHandler;

在事件生成類中,類似

myEvent?.Invoke(this, new EventArgs());

可以使用。 我想知道在(取消)訂閱事件時是否可以使用類似的構造,例如:

eventGeneratingClass?.myEvent += myHandler;
eventGeneratingClass?.myEvent -= myHandler;

我發現兩者是否都存在nullables的加法賦值運算符的簡寫,如果將null設置為null,該賦值運算符是否成立? 以及如何使用反射調用自定義運算符

這導致我: 運算符重載使用指南

這導致我嘗試

eventGeneratingClass?.myEvent.op_AdditionAssignment(myHandler);
eventGeneratingClass?.myEvent.op_SubtractionAssignment(myHandler);

但似乎事件沒有op_AdditionAssignment成員函數,或者至少沒有為我提供錯誤

事件“ EventGeneratingClass.myEvent”只能出現在+ =或-= ...的左側。

那是我被困住的地方...

空條件運算?. 當左側表達式為null時,返回null。

所以在

 eventGeneratingClass?.myEvent += myHandler 

如果eventGeneratingClass為null,則eventGeneratingClass?.myEvent為null。 嘗試將事件偵聽器附加到null會導致NullReferenceException

?. 運算符確實使處理null更容易,但並不能消除對它們的處理。

如果您正在尋找使用空條件運算符的解決方案,那么您似乎不走運。 C#規范草案中

空條件表達式作為語句表達式

如果空條件表達式以調用結尾,則只能將其作為statement_expression(Expression語句)。 在語法上,該要求可以表示為:

 null_conditional_invocation_expression : primary_expression null_conditional_operations '(' argument_list? ')' ; 

這是上面null_conditional_expression的語法的特例。 然后,Expression語句中statement_expression的生成僅包含null_conditional_invocation_expression。

因此,您需要將+=作為+=(myHandler)調用(即eventGeneratingClass?.myEvent?.+=(myHandler) ),這是不可能的。

您可以使用擴展方法:

public static class Extensions
{
    public static void IfNotNull<T>(this T instance, Action<T> action)
    {
        if (instance != null)
        {
            action(instance);
        }
    }
}

然后打電話

someInstance.IfNotNull(_ => _.SomethingHappened += (sender, eventArgs) =>
{
    // code
});

但是話又說回來,您甚至可以使用if子句,因為擴展方法不會使代碼更加冗長。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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