如何在仅知晓事件触发者类型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
相关产品推荐
相关产品推荐

