如何为类中指定类型的所有属性批量添加事件处理程序?
利用反射批量订阅Metric属性的事件
完全可以实现批量订阅,通过反射遍历类中所有Metric类型的属性,再动态获取事件并绑定处理程序,避免重复编写手动订阅代码。
修改后的构造函数代码如下:
internal class myValues { public myValues () { // 筛选出当前类中所有public的Metric类型实例属性 var metricProperties = typeof(myValues) .GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(p => p.PropertyType == typeof(Metric)); foreach (var prop in metricProperties) { // 获取当前实例中该属性的具体对象 var metricInstance = prop.GetValue(this) as Metric; if (metricInstance == null) continue; // 跳过未初始化的属性,防止空引用 // 绑定AnyChanged事件 var anyChangedEvent = typeof(Metric).GetEvent(nameof(Metric.AnyChanged)); anyChangedEvent?.AddEventHandler(metricInstance, new EventHandler(OnMetricChanged)); // 绑定ValueChanged事件 var valueChangedEvent = typeof(Metric).GetEvent(nameof(Metric.ValueChanged)); valueChangedEvent?.AddEventHandler(metricInstance, new EventHandler(OnMetricValueChanged)); // 绑定DeltaChanged事件 var deltaChangedEvent = typeof(Metric).GetEvent(nameof(Metric.DeltaChanged)); deltaChangedEvent?.AddEventHandler(metricInstance, new EventHandler(OnMetricDeltaChanged)); } } // 注意:要确保这些属性已经被初始化,否则无法订阅事件 public Metric Test1 { get; private set; } = new Metric(); public Metric Test2 { get; private set; } = new Metric(); public Metric Test3 { get; private set; } = new Metric(); public Metric Test4 { get; private set; } = new Metric(); // 对应事件的处理方法,要和Metric中事件的委托类型匹配 private void OnMetricChanged(object sender, EventArgs e) { // 你的处理逻辑 } private void OnMetricValueChanged(object sender, EventArgs e) { // 你的处理逻辑 } private void OnMetricDeltaChanged(object sender, EventArgs e) { // 你的处理逻辑 } }
几个关键注意点:
- 属性初始化:必须保证每个Metric属性都已经实例化(比如像代码里那样在声明时赋值
new Metric()),否则prop.GetValue(this)会返回null,无法完成事件绑定。 - 委托类型匹配:如果Metric的事件不是标准的
EventHandler类型(比如是带自定义参数的EventHandler<MyEventArgs>),需要把new EventHandler(...)替换成对应的委托类型。 - 反射性能:反射会有少量性能损耗,但在构造函数中只执行一次,对整体性能影响可以忽略。如果想要优化,可以提前缓存三个EventInfo对象,避免每次循环都调用
GetEvent。
内容的提问来源于stack exchange,提问作者totalZero
相关产品推荐
相关产品推荐

