簡體   English   中英

在C#中將通用EventHandler作為函數參數傳遞

[英]Passing generic EventHandler as function parameter in C#

我正在創建一個基礎Object類,它具有一些我想在程序中使用的功能。 我想包括的功能之一是通用的TriggerEvent函數,該函數假設在觸發傳入的事件之前進行一些基本檢查:

/// <summary>
/// Executes the specified event if one of several internal conditions are met:
/// 1. The event is not null
/// 2. The DisableEvents property is not enavled
/// </summary>
/// <param name="eventProcedure">Event to execute</param>
/// <param name="e">Event arguments object (or null if none specified)</param>
protected void TriggerEvent(EventHandler<EventArgs> eventProcedure, EventArgs e = null)
{
    if (eventProcedure != null)
    {
        if (!DisableEvents)
        {
            eventProcedure(this, e);
        }
    }
}

我遇到麻煩的地方是我希望能夠將通用EventHandlers傳遞給此函數,以便我也可以處理可能采用各種形式的EventArgs對象參數的事件。 例如,我有一個這樣的:

/// <summary>
/// Used with the PrintMessage Event
/// </summary>
public class MessageEventArgs : EventArgs
{
    public MessageEventArgs(string messageText)
    {
        MessageText = messageText;
    }

    public string MessageText { get; private set; }
}

以及相關事件:

public event EventHandler<MessageEventArgs> PrintMessage;

例如,此事件將允許我將消息傳遞給父對象。 但是我還希望能夠將TriggerEvent函數與可能與其他自定義Event args對象相關聯的事件一起使用:

public event EventHandler<CustomEventArgs> SomeEvent;
public event EventHandler<EventArgs> SomeNormalEvent;

然后可以使用TriggerEvent函數執行其中任何一個:

TriggerEvent(PrintMessage, new MessageEventArgs(textToSend));
TriggerEvent(SomeEvent, ExistingCustomEventArgs);
TriggerEvent(SomeNormalEvent);

但是,當我嘗試使用TriggerEvent函數調用例如說以下內容的PrintMessage事件時,出現了錯誤:

Argument 1: Cannot convert from 'System.EventHandler<TestProject.MessageEventArgs>' to 'System.EventHandler<System.EventArgs>'

如何修改TriggerEvent函數,以便可以使用它檢查和執行多種類型的事件?

我可以想到兩種方式。

  1. 傳遞一個委托代替執行該事件。

protected void TriggerEvent(Action<EventArgs> eventProcedure, EventArgs e = null) if (eventProcedure != null && !DisableEvents) { eventProcedure(e); }

要不就...

protected void TriggerEvent(Action eventProcedure) if (eventProcedure != null && !DisableEvents) { eventProcedure(); }

並使用如下代碼: TriggerEvent(() => MyEvent?.Invoke(this, new MyEventArgs(...)))

  1. 使用通用方法:

protected void TriggerEvent<T>(EventHandler<T> eventProcedure, T e = null) where T : EventArgs if (eventProcedure != null && !DisableEvents) { eventProcedure(this, e); }

暫無
暫無

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

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