c# - 在 C# 中将泛型 EventHandler 作为函数参数传递
问题描述
我正在创建一个基 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);
}
推荐阅读
- excel - 我想对连续数字的总数求和(类似于附加的连续数字的计数)
- javascript - 是否可以在文档 JavsScript 的顶部获取第一行 html
- ldap - 自由半径 + ldap 389 DS
- sql - 试图将一个表中的字段插入到另一个表中
- r - 绘制时间序列并计算超出阈值的次数
- ruby-on-rails - 运行 rails server 时无法加载此类文件 == rails/cli 错误
- jquery - 使用 Ajax 调用的结果填充复选框
- r - rvest read_html 用于特定表
- node.js - 本地的Vue.js,NGINX docker容器,如何用Node保存文件?
- cassandra - 使用 AvroConverter 启动时出现 Kafka Connect 错误