近期将项目Unity版本从5.6升级到了2018.4.4,在解决完一系列可见语法错误后。遇到了个很神奇的错误,这在升级前是没有的,经过排查,最后锁定在下面的代码上(dramaEndBuildMapCallBack为Action类型):
if (this.dramaEndBuildMapCallback != null) { this.dramaEndBuildMapCallback(); this.dramaEndBuildMapCallback = null; }
可以看出,该块代码想表达的意思是执行完委托就清空。事实上在Unity5.6的时候它确实可以正常工作,但是随着Unity升级,.Net版本也升级到4.x,这种方式失效了。
经过查询,找到了一个可以正常清空委托列表的方法,首先通过GetInvocationList()方法获取委托列表,然后遍历,删掉。。
/// <summary> /// 清除委托列表。 /// </summary> /// <param name="action"></param> public static void ClearDelegage(Action action) { if (action != null) { Delegate[] delegates = action.GetInvocationList(); for (int i = 0; i < delegates.Length; i++) { action -= delegates[i] as Action; } } }
好想吐槽一下,为什么C#没提供一个像链表Clear()那样的方法来清除委托列表呢_(:з」∠)_
1 comment
😛