using System;
using System.Collections.Generic;
using UnityEngine;
namespace Plugins.JNGame.Util
{
///
/// 静态事件分发器
///
public class EventDispatcher
{
public static readonly EventDispatcher Event = new EventDispatcher();
public Dictionary> EventHandlers { get; private set; } = new();
///
/// 添加事件监听器
///
/// 事件标识符
/// 事件监听器
public void AddListener(string eventId, Action listener)
{
if (!EventHandlers.ContainsKey(eventId))
{
EventHandlers[eventId] = new List();
}
EventHandlers[eventId].Add(listener);
Debug.Log(eventId+ "AddListener" + EventHandlers[eventId].Count);
}
///
/// 添加事件监听器
///
/// 事件参数类型
/// 事件标识符
/// 事件监听器
public void AddListener(string eventId, Action listener)
{
if (!EventHandlers.ContainsKey(eventId))
{
EventHandlers[eventId] = new List();
}
EventHandlers[eventId].Add(listener);
Debug.Log(eventId+ "AddListener" + EventHandlers[eventId].Count);
}
///
/// 移除事件监听器
///
/// 事件参数类型
/// 事件标识符
/// 事件监听器
public void RemoveListener(string eventId, Action listener)
{
if (EventHandlers.ContainsKey(eventId))
{
//eventHandlers[eventId] = (Action)eventHandlers[eventId] - listener;
EventHandlers[eventId].Remove(listener);
Debug.Log(eventId + "RemoveListener" + EventHandlers[eventId].Count);
}
}
public void RemoveListener(string eventId, Action listener)
{
if (EventHandlers.ContainsKey(eventId))
{
//eventHandlers[eventId] = (Action)eventHandlers[eventId] - listener;
EventHandlers[eventId].Remove(listener);
Debug.Log(eventId + "RemoveListener" + EventHandlers[eventId].Count);
}
}
///
/// 分发事件
///
/// 事件参数类型
/// 事件标识符
/// 事件参数
public void Dispatch(string eventId, T args)
{
if (EventHandlers.ContainsKey(eventId) && EventHandlers[eventId] != null)
{
foreach(Delegate fun in EventHandlers[eventId])
{
// 确保 fun 实际上是指向一个 Action 类型的函数
if (fun.Method.GetParameters().Length == 1 && fun.Method.GetParameters()[0].ParameterType == typeof(T))
{
((Action)fun)(args);
}
}
}
}
public void Dispatch(string eventId)
{
if (EventHandlers.ContainsKey(eventId) && EventHandlers[eventId] != null)
{
foreach(Delegate fun in EventHandlers[eventId])
{
// 确保 fun 实际上是指向一个 Action 类型的函数
if (fun.Method.GetParameters().Length == 0)
{
((Action)fun)();
}
}
}
}
public void Reset()
{
EventHandlers = new();
}
}
}