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

C# 下层类不可持有上层类成员时如何触发上层类方法调用

C#实现方案

方案1:使用C#内置事件机制(推荐)

这是最适配你分层架构场景的方案,下层B类仅需定义事件,上层A主动订阅事件即可,B完全不需要感知A的存在,完全符合下层不依赖上层的约束。

实现代码:

  1. 改造B类,定义执行完成后的事件:
public class B
{
    // 可根据需求自定义事件参数,这里用无参数Action做示例
    public event Action OnFunctionExecuted;

    public void FunctionToBeCalledAfter()
    {
        // 原有业务逻辑
        Console.WriteLine("B的FunctionToBeCalledAfter执行完毕");
        
        // 触发事件,判空避免无订阅者时报空引用
        OnFunctionExecuted?.Invoke();
    }
}
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:24:01