之前写了一个简单的事件工具类,使用字典来进行存储。
当时想的是使用TryGetValue少进行一次遍历。在项目使用中发现只有一个事件生效。后续在注册的事件无法生效。
当时的写法
private readonly Dictionary<int, Action<IEventMessage>> mListeners;
/// <summary>
/// 注册事件
/// </summary>
public IUnRegister Register<TEvent>(Action<IEventMessage> listener) where TEvent : IEventMessage
{
int eventId = typeof(TEvent).GetHashCode();
if (mListeners.TryGetValue(eventId,out var listeners))
{
listeners += listener;
}
else
{
mListeners.Add(eventId, listener);
}
return new CustomUnRegister(() => UnRegister<TEvent>(listener));
}
更改后的写法
private readonly Dictionary<int, Action<IEventMessage>> mListeners;
/// <summary>
/// 注册事件
/// </summary>
public IUnRegister Register<TEvent>(Action<IEventMessage> listener) where TEvent : IEventMessage
{
int eventId = typeof(TEvent).GetHashCode();
if (mListeners.ContainsKey(eventId))
{
mListeners[eventId] += listener;
}
else
{
mListeners.Add(eventId, listener);
}
return new CustomUnRegister(() => UnRegister<TEvent>(listener));
}
deepseek的回答:
可以使用下面代码验证上述回答
Action action = () =>
{
Debug.Log("action");
};
Action action2 = action;
action += () =>
{
Debug.Log("action +=");
};
action.Invoke();
Debug.Log("-------------------------------------------");
action2.Invoke();