我有以下字典:
private Dictionary<string, Action<GameObject, int, int, int, int>> eventDictionary;
我希望保留一个操作字典(基本上是委托),以便每当我希望订阅事件名称时,我都可以为所有订阅者订阅相同的事件。
这是我监听某个事件字符串的函数:
public static void StartListening(string eventName, Action<GameObject, int, int, int, int> listener)
{
Action<GameObject, int, int, int, int> thisEvent = null;
if (instance.eventDictionary.TryGetValue(eventName, out thisEvent))
{
thisEvent += listener;
// the code reaches this
}
else
{
thisEvent += listener;
instance.eventDictionary.Add(eventName, thisEvent);
}
}
现在我尝试
EventManager.StartListening("Move", Moved);
EventManager.StartListening("Move", Moved);
EventManager.StartListening("Move", Moved);
EventManager.StartListening("Move", Moved);
// Log here to get how many subscribers there are to the event "Move"
// Result: only 1 listener
只有第一个添加的侦听器会实际注册,其余侦听器在添加后“消失”。我调试了这个错误近 4 个小时,最后测试看看是否可能是这条线thisEvent += listener;
发生故障。当我添加删除并随后添加回字典时,
public static void StartListening(string eventName, Action<GameObject, int, int, int, int> listener)
{
Action<GameObject, int, int, int, int> thisEvent = null;
if (instance.eventDictionary.TryGetValue(eventName, out thisEvent))
{
thisEvent += listener;
instance.eventDictionary.Remove(eventName);
instance.eventDictionary.Add(eventName, thisEvent);
}
else
{
thisEvent += listener;
instance.eventDictionary.Add(eventName, thisEvent);
}
}
代表们终于如期加入了。
EventManager.StartListening("Move", Moved);
EventManager.StartListening("Move", Moved);
EventManager.StartListening("Move", Moved);
EventManager.StartListening("Move", Moved);
// Log here to get how many subscribers there are to the event "Move"
// Result: 4 listeners
这是我遇到过的最荒谬的错误之一。字典中不是字符串、整数等的所有值都应该通过引用而不是值来检索吗?为什么我在这里得到操作的克隆,而不是引用?
附:
GameObject 是一个 Unity 类。
这是我的移动功能:
public void Moved(GameObject invoker, int x, int z, int tx, int tz)
{
//Some code here
}