Skip to content

feat(event): 新增 HasEventListener 接口,支持检测事件是否已被监听 - #288

Open
isolamenter wants to merge 1 commit into
Alex-Rachel:mainfrom
isolamenter:feat/has-event-listener
Open

feat(event): 新增 HasEventListener 接口,支持检测事件是否已被监听#288
isolamenter wants to merge 1 commit into
Alex-Rachel:mainfrom
isolamenter:feat/has-event-listener

Conversation

@isolamenter

Copy link
Copy Markdown

动机 / 背景 (Motivation)

在实际游戏业务开发中(如剧情播放器、UI 弹窗生命周期管理、网络重连等场景),经常需要在分发事件、反注册事件或重复注册前,预先探测某个事件是否已存在监听回调

目前 TEngine 的 `GameEvent` 仅提供了 `AddEventListener` 与 `RemoveEventListener`。如果在未注册的情况下调用 `RemoveEventListener`,底层会直接打印 `Log.Fatal("Delete handle failed, not exist...")`。增加 `HasEventListener` 能够大幅提升事件管理的防御性编程体验与健壮性。

改动内容 (Changes)

  1. `EventDelegateData`
    • 增加 `internal bool HasHandler(Delegate handler)` 方法,支持在 `_isExecute` 执行中对 `_deleteList` 与 `_addList` 的脏状态精确检测。
  2. `EventDispatcher`
    • 增加 `public bool HasEventListener(int eventType, Delegate handler)`。
  3. `GameEvent` 静态入口
    • 补充了与 `AddEventListener` / `RemoveEventListener` 完全对称的重载方法:
      • 支持 `int` 类型事件(无参、泛型 1~6 参、`Delegate` 通用回调)。
      • 支持 `string` 类型事件(无参、泛型 1~5 参、`Delegate` 通用回调)。
    • 补充了规范的 XML 中文文档注释。

使用示例 (Usage Example)

```csharp
// 1. int 事件检测
if (GameEvent.HasEventListener(PlotEvent.EVENT_PLOT_SCENE_FINISH, OnPlotSceneFinished))
{
GameEvent.RemoveEventListener(PlotEvent.EVENT_PLOT_SCENE_FINISH, OnPlotSceneFinished);
}

// 2. 带参数泛型事件检测
if (!GameEvent.HasEventListener<int, string>(GameEventId.OnPlayerLevelUp, OnLevelUp))
{
GameEvent.AddEventListener<int, string>(GameEventId.OnPlayerLevelUp, OnLevelUp);
}

// 3. string 事件检测
if (GameEvent.HasEventListener("OnGoldChanged", OnGoldChanged))
{
// ...
}
```

兼容性 (Compatibility)

  • 纯增量改动(Non-breaking Change):未修改任何已有方法签名,完全向下兼容。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant