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

如何为类中指定类型的所有属性批量添加事件处理程序?

利用反射批量订阅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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:22:45