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

多类间事件处理问题:无ThirdClass实例时Program类如何响应其事件

如何在Program类中处理ThirdClass触发的Event?

嘿,我懂你的问题——你在ThirdClass里触发了myEvent,SecondClass能接住并处理,但Program类里根本拿不到ThirdClass的实例,没法直接订阅它的事件对吧?有两种实用的解决思路,我给你一步步讲清楚:


方法一:在SecondClass中透传事件(最符合事件驱动的设计)

这种方法是让SecondClass自己暴露一个事件,当它接收到ThirdClass的事件时,再触发自己的这个事件,这样Program就能直接订阅SecondClass的事件来执行MyPurpose()了。

修改后的完整代码如下:

public class Program 
{ 
    static void Main(string[] args) 
    { 
        Program myProgram = new Program(); 
        SecondClass second = new SecondClass();
        // 订阅SecondClass暴露的透传事件
        second.ThirdClassCounted += myProgram.MyPurpose;
        second.LaunchSecondClass(); 
    } 

    public void MyPurpose() 
    { 
        Console.WriteLine("Program Class here!"); 
        Console.ReadLine(); 
    } 
}

public class SecondClass 
{
    // 声明一个透传用的事件,让Program可以订阅
    public event Action ThirdClassCounted;

    public void LaunchSecondClass() 
    { 
        ThirdClass third = new ThirdClass(); 
        third.myEvent += this.OnCounted; 
        third.count(); 
    } 

    private void OnCounted(object sender, EventArgs e) 
    { 
        Console.WriteLine("Second Class Here.");
        // 触发透传事件,通知Program
        ThirdClassCounted?.Invoke();
    } 
}

public class ThirdClass 
{ 
    public event EventHandler myEvent; 

    public void count() 
    { 
        for (int i = 0; i < 3; i++) 
        { 
            Thread.Sleep(1000); 
        } 
        OnCounted(); 
    } 

    protected virtual void OnCounted() 
    { 
        myEvent?.Invoke(this, EventArgs.Empty); 
    } 
}

关键修改点:

  • 在SecondClass中新增了ThirdClassCounted事件(用Action简化,因为不需要额外参数)
  • 在SecondClass的OnCounted方法里,调用ThirdClassCounted?.Invoke()触发透传事件
  • 在Program的Main方法中,订阅second.ThirdClassCounted事件,绑定到myProgram.MyPurpose

方法二:给SecondClass传递回调方法(更轻量的方式)

如果不想额外声明事件,也可以直接给SecondClass传递一个回调函数,当ThirdClass的事件触发时,直接调用这个回调。

修改后的代码示例:

public class Program 
{ 
    static void Main(string[] args) 
    { 
        Program myProgram = new Program(); 
        SecondClass second = new SecondClass();
        // 把MyPurpose作为回调传递给SecondClass
        second.LaunchSecondClass(myProgram.MyPurpose); 
    } 

    public void MyPurpose() 
    { 
        Console.WriteLine("Program Class here!"); 
        Console.ReadLine(); 
    } 
}

public class SecondClass 
{
    // 修改LaunchSecondClass方法,接受一个回调参数
    public void LaunchSecondClass(Action onCountedCallback) 
    { 
        ThirdClass third = new ThirdClass(); 
        // 直接把回调逻辑绑定到ThirdClass的事件,或者在自己的处理方法里调用
        third.myEvent += (sender, e) => 
        {
            Console.WriteLine("Second Class Here.");
            onCountedCallback?.Invoke();
        }; 
        third.count(); 
    } 
}

public class ThirdClass 
{ 
    public event EventHandler myEvent; 

    public void count() 
    { 
        for (int i = 0; i < 3; i++) 
        { 
            Thread.Sleep(1000); 
        } 
        OnCounted(); 
    } 

    protected virtual void OnCounted() 
    { 
        myEvent?.Invoke(this, EventArgs.Empty); 
    } 
}

关键修改点:

  • 把SecondClass的LaunchSecondClass方法改成接受Action类型的参数
  • 在绑定ThirdClass的事件时,直接在匿名方法里执行回调,或者也可以在原来的OnCounted方法里调用回调
  • 在Program的Main中,调用LaunchSecondClass时传入myProgram.MyPurpose

两种方法都能实现你的需求:当ThirdClass的myEvent触发时,Program的MyPurpose方法会被执行。如果你的场景后续可能还有其他类需要监听这个事件,推荐用方法一;如果只是Program需要处理,方法二更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:41:56