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

如何让C#多层类的Refresh方法自动执行类似构造函数的基类调用?

解决方案:自动实现继承体系中Refresh方法的基类调用

针对你在多层类继承结构中需要自动调用基类Refresh方法的需求,目前有几种成熟的实现方案,无需手动编写base.Refresh()且能避免遗漏:

1. Roslyn源代码生成器(推荐,原生编译时支持)

利用C#的Roslyn Source Generator特性,在编译阶段自动为子类的Refresh方法插入基类调用逻辑,甚至可以强制约束规范:

  • 自定义一个标记特性,比如[AutoCallBaseRefresh(CallOrder.Before)](支持指定在方法体前/后调用);
  • 编写源代码生成器,扫描所有继承自标记基类的子类:
    • 若子类未定义Refresh方法,自动生成包含base.Refresh()调用的方法;
    • 若子类已定义Refresh方法,自动在方法体开头或结尾插入base.Refresh();
  • 配合Roslyn分析器,若子类手动实现Refresh但未调用基类方法,直接抛出编译警告/错误,强制规范。

这种方案是编译时处理,无运行时性能开销,完全符合C#原生开发体验,不需要额外运行时依赖。

2. AOP框架(快速实现,第三方依赖)

使用编译时或运行时AOP框架,通过切面注入基类调用逻辑:

  • PostSharp:编译时织入代码,自定义一个RefreshBaseCallAspect,指定在方法执行前/后调用基类的Refresh方法,然后将该切面应用到基类的Refresh方法上,所有子类的Refresh方法会自动继承该切面逻辑;
  • Castle DynamicProxy:运行时生成代理类,在代理中拦截Refresh方法调用,先执行基类逻辑再执行子类逻辑。

优势是无需大幅修改现有代码结构,通过注解即可实现;缺点是需要引入第三方库,运行时代理会有轻微性能损耗(PostSharp编译时织入无此问题)。

3. 模板方法模式(无依赖,代码结构调整)

通过设计模式从根源避免遗漏,无需第三方工具:

  • 定义抽象基类,将Refresh设为非虚的固定入口方法,内部先执行自身的刷新逻辑,再调用子类实现的抽象方法(比如RefreshCore);
  • 多层继承时,每个子类的RefreshCore方法先调用base.RefreshCore(),再执行自身字段的刷新。

示例代码:

public abstract class BaseLevel
{
    public void Refresh()
    {
        // 基类自身的字段刷新逻辑
        RefreshLevelFields();
        // 调用子类的自定义刷新逻辑
        RefreshCore();
    }

    protected abstract void RefreshCore();

    private void RefreshLevelFields()
    {
        // Level1字段刷新逻辑
    }
}

public class Level2 : BaseLevel
{
    protected override void RefreshCore()
    {
        // 先调用父类的核心刷新逻辑
        base.RefreshCore();
        // Level2字段刷新逻辑
    }
}

public class Level3 : Level2
{
    protected override void RefreshCore()
    {
        base.RefreshCore();
        // Level3字段刷新逻辑
    }
}

这种方案完全依赖C#原生特性,无任何外部依赖,但需要调整现有代码的方法结构,将原来的Refresh拆分为固定入口和可变逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:21:01