Unityは、すべてのイベントをデリゲートにバインドしてクリアします

参考:https://www.cnblogs.com/fangxiao/archive/2011/08/11/2134623.html 
class Class1
    {
       #region 帮助委托
        /// <summary>
        /// 移除所有注册事件  移除类 的名为eventname 的委托
        /// </summary>
        public static void RemoveAllEvent(object _class, string eventname)
        {
            var newType = _class.GetType();
            foreach (var item in newType.GetEvents())
            {
                if (eventname == item.Name)
                {
                    GameLogger.Logger.Info($"RemoveAllEvent : EventName={item.Name}");
                    FieldInfo _Field = newType.GetField(item.Name, BindingFlags.Instance | BindingFlags.NonPublic);
                    if (_Field != null)
                    {
                        object _FieldValue = _Field.GetValue(_class);
                        if (_FieldValue != null && _FieldValue is Delegate)
                        {
                            Delegate _ObjectDelegate = (Delegate)_FieldValue;
                            Delegate[] invokeList = _ObjectDelegate.GetInvocationList();
                            if (invokeList != null)
                            {
                                GameLogger.Logger.Info($"RemoveAllEvent : EventNameinvokeList={invokeList.Length}");
                                foreach (Delegate del in invokeList)
                                {
                                    GameLogger.Logger.Info($"RemoveAllEvent : del={del.Method.ToString()}");
                                   item.RemoveEventHandler(_class, del);
                                }
                            }
                        }
                    }
                }
               
            }
        }
        #endregion
    }

 

おすすめ

転載: blog.csdn.net/weixin_41995872/article/details/108869523