接口声明静态事件后实现类触发报错,求监听实例创建方案
问题分析与解决方案
你的问题根源在于C#接口的静态成员不具备全局共享性:接口中定义的静态事件EvtSpawned属于接口本身,但实现该接口的类并不会继承或共享这个静态事件实例。当你在PlayerSingle中调用IProgress.EvtSpawned?.Invoke(this)时,这个事件实际上从未被初始化,自然会触发错误。
正确实现方式:用静态管理类统一处理全局事件
不要在接口中定义静态事件,而是创建一个独立的静态类来管理这个全局的实例创建通知:
1. 调整接口定义(仅保留标识或必要实例成员)
public interface IProgress { // 这里不需要静态事件,仅作为实现类的标识或定义实例方法 }
2. 创建静态事件管理类
public static class ProgressSpawnManager { // 全局共享的实例创建事件 public static event Action<IProgress> EvtSpawned; // 统一的通知方法,供实现类调用 public static void NotifySpawned(IProgress progressInstance) { EvtSpawned?.Invoke(progressInstance); } }
3. 修改实现类的调用逻辑
public class PlayerSingle : MonoBehaviour, IProgress { private void Start() { // 通过管理类触发全局事件 ProgressSpawnManager.NotifySpawned(this); } }
方案优势
- 所有实现
IProgress的类都通过同一个入口触发事件,订阅方只需订阅ProgressSpawnManager.EvtSpawned,就能监听所有实例的创建通知。 - 避免了每个实现类重复定义静态事件的冗余代码,逻辑更统一。
内容的提问来源于stack exchange,提问作者ShackMan
相关产品推荐
相关产品推荐

