C# 下层类不可持有上层类成员时如何触发上层类方法调用
C#实现方案
方案1:使用C#内置事件机制(推荐)
这是最适配你分层架构场景的方案,下层B类仅需定义事件,上层A主动订阅事件即可,B完全不需要感知A的存在,完全符合下层不依赖上层的约束。
实现代码:
- 改造B类,定义执行完成后的事件:
public class B { // 可根据需求自定义事件参数,这里用无参数Action做示例 public event Action OnFunctionExecuted; public void FunctionToBeCalledAfter() { // 原有业务逻辑 Console.WriteLine("B的FunctionToBeCalledAfter执行完毕"); // 触发事件,判空避免无订阅者时报空引用 OnFunctionExecuted?.Invoke(); } }
- A类持有B的实例,初始化时订阅B的事件:
public class A { private readonly B _b; public A(B b) { _b = b; // 订阅B的执行完成事件 _b.OnFunctionExecuted += FunctionToBeCalled; } public void FunctionToBeCalled() { Console.WriteLine("A的FunctionToBeCalled被触发执行"); } // 生命周期结束时取消订阅,避免内存泄漏 public void Dispose() { _b.OnFunctionExecuted -= FunctionToBeCalled; } }
调用流程验证:
不管是C类还是其他模块调用B的方法,只要方法执行完成就会自动触发A的对应逻辑,全程B、C都不需要持有A的实例:
var b = new B(); var a = new A(b); // 模拟C类调用B的方法 b.FunctionToBeCalledAfter(); // 输出顺序: // B的FunctionToBeCalledAfter执行完毕 // A的FunctionToBeCalled被触发执行
方案2:使用委托回调(适合单订阅者场景)
如果你确定只有一个上层模块需要监听B的执行结果,可以用更简单的委托注入实现:
public class B { public Action? AfterCallBack { get; set; } public void FunctionToBeCalledAfter() { Console.WriteLine("B的FunctionToBeCalledAfter执行完毕"); AfterCallBack?.Invoke(); } } public class A { public A(B b) { b.AfterCallBack = FunctionToBeCalled; } public void FunctionToBeCalled() { Console.WriteLine("A的FunctionToBeCalled被触发执行"); } }
注意:该方案同一时间只能注册一个回调,新的赋值会覆盖之前的回调配置,不适合多监听者场景。
内容的提问来源于stack exchange,提问作者Ristea Stefan
相关产品推荐
相关产品推荐

