[英]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函數,以便可以使用它檢查和執行多種類型的事件?
我可以想到兩種方式。
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(...)))
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.