[英]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.