如何让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
相关产品推荐
相关产品推荐

