You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在仅知晓事件触发者类型AType时,通过反射添加事件处理器myhandler?

通过反射为指定类型实例添加事件处理器

没问题,我来给你把这个逻辑讲透——你给出的代码方向完全正确,我再补全细节、完整示例和踩坑注意点:

核心步骤拆解

其实就是三个关键动作,你已经摸到门道了:

  • 第一步:通过目标类型AType获取对应的EventInfo对象,要确保事件名称完全匹配(区分大小写)
  • 第二步:准备好和事件委托类型兼容的处理器委托myhandler
  • 第三步:调用EventInfo.AddEventHandler()把委托绑定到目标实例上

完整示例代码

假设我们以ObservableCollection<T>的CollectionChanged事件为例,完整可运行的代码如下:

// 1. 定义符合事件委托类型的处理器方法
private void SomeHandler(object sender, NotifyCollectionChangedEventArgs e)
{
    Console.WriteLine($"集合发生变化:{e.Action}");
}

// 2. 获取目标类型(这里以ObservableCollection<int>为例)
Type AType = typeof(ObservableCollection<int>);

// 3. 创建该类型的实例
object ObjectOfAType = Activator.CreateInstance(AType);

// 4. 获取指定事件的EventInfo
EventInfo info = AType.GetEvent("CollectionChanged");

// 5. 把处理器方法包装成兼容的委托
Delegate myhandler = new NotifyCollectionChangedEventHandler(SomeHandler);

// 6. 绑定事件处理器
info.AddEventHandler(ObjectOfAType, myhandler);

// 测试一下:修改集合触发事件
((ObservableCollection<int>)ObjectOfAType).Add(1);

必须注意的踩坑点

  • 委托类型必须严格兼容:如果你的myhandler和事件的委托签名不匹配(比如参数数量、类型不对),调用AddEventHandler时会直接抛出ArgumentException。如果不确定委托类型,可以通过info.EventHandlerType动态创建委托,比如:
    Delegate myhandler = Delegate.CreateDelegate(info.EventHandlerType, this, nameof(SomeHandler));
    
  • 目标实例不能为null:ObjectOfAType必须是AType的有效实例,不能传null,否则会抛出ArgumentNullException。
  • 非公开事件的处理:如果要绑定的是非公开事件,需要用GetEvent的重载指定绑定标志,比如:
    EventInfo info = AType.GetEvent("PrivateEvent", BindingFlags.Instance | BindingFlags.NonPublic);
    

内容的提问来源于stack exchange,提问作者Fabian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:21:13