多类间事件处理问题:无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
相关产品推荐
相关产品推荐

