我已经扩展了这个类http://wiki.unity3d.com/index.php/CSharpMessenger_Extended以接受包含通配符作为eventTypes的字符串,因此我可以编写类似
的内容Messenger.AddListener("*", () => Console.WriteLine("woohoo, generic handler"));
但我非常关注这种实施的表现。
我已经像这样扩展了Dictionary类:
public class EventDictionary : Dictionary<string, Delegate>
{
public Delegate[] GetHandlers(string Event)
{
List<Delegate> matches = new List<Delegate>();
foreach (string pattern in Keys)
if (Regex.IsMatch(Event, Regex.Escape(pattern).Replace( @"\*", ".*" ).Replace( @"\?", "." )))
matches.Add(this[pattern]);
UnityEngine.Debug.Log(matches.Count);
return matches.ToArray();
}
}
如您所见,对于字典中的每个键,我首先将其转换为正则表达式,然后检查它是否与事件名称匹配,如果是,则将其添加到集合中并返回数组。
但是,这段代码在一个经常使用信使脚本的游戏中运行,因此我真的很担心这种方法的性能。
我的解决方案是否可接受?如果不是什么是解决我的问题的更好的方法?
非常感谢