Пример #1
0
        private void Add(MethodInfoObject mio, string newEventName = "")
        {
            string eventName = newEventName != "" ? newEventName : mio.Method.Name;

            if (mio.Method.GetCustomAttributes(typeof(Bind), true).Length > 0)
            {
                foreach (var attr in mio.Method.GetCustomAttributes(typeof(Bind), true))
                {
                    if (attr.GetType() != typeof(Bind))
                    {
                        continue;
                    }
                    var e = (Bind)attr;
                    eventName = newEventName != "" ? newEventName : e.EventName ?? mio.Method.Name;
                    Add(e, mio, realEventName: eventName);
                    // eventName = newEventName != "" ? newEventName : e.EventName ?? mio.Method.Name;
                    // if (!_eventListeners.ContainsKey(eventName))
                    //     _eventListeners.Add(eventName, new List<MethodInfoObject>());
                    // if (!_eventListeners[eventName].Contains(mio))
                    //     _eventListeners[eventName].Add(mio);
                }
            }
            else
            {
                if (!_eventListeners.ContainsKey(eventName))
                {
                    _eventListeners.Add(eventName, new List <MethodInfoObject>());
                }
                if (!_eventListeners[eventName].Contains(mio))
                {
                    _eventListeners[eventName].Add(mio);
                }
            }
        }
Пример #2
0
 /// <summary>
 /// Добавить все подписанные методы объекта
 /// </summary>
 /// <param name="obj">Объект</param>
 public void Add(object obj)
 {
     foreach (var methodInfo in obj.GetType().GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
     {
         foreach (var attr in methodInfo.GetCustomAttributes(typeof(Bind), true))
         {
             if (attr.GetType() != typeof(Bind))
             {
                 continue;
             }
             var e   = (Bind)attr;
             var mio = new MethodInfoObject {
                 Target = obj, Method = methodInfo
             };
             Add(e, mio);
             // var eventName = e.EventName ?? methodInfo.Name;
             // if (eventName.Contains("{"))
             //     eventName = Smart.Format(eventName, obj);
             //
             // if (!_eventListeners.ContainsKey(eventName))
             //     _eventListeners.Add(eventName, new List<MethodInfoObject>());
             // var mio = new MethodInfoObject {Target = obj, Method = methodInfo };
             // if (!_eventListeners[eventName].Contains(mio))
             //     _eventListeners[eventName].Add(mio);
         }
     }
 }
Пример #3
0
        /// <summary>
        /// Удалить все подписанные события
        /// </summary>
        /// <param name="obj">Объект</param>
        public void Remove(object obj)
        {
            foreach (var methodInfo in obj.GetType()
                     .GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
            {
                foreach (var attr in methodInfo.GetCustomAttributes(typeof(Event), true))
                {
                    if (attr.GetType() != typeof(Event))
                    {
                        continue;
                    }
                    var e         = (Event)attr;
                    var eventName = e.EventName ?? methodInfo.Name;
                    var mio       = new MethodInfoObject {
                        Target = obj, Method = methodInfo
                    };

                    if (_eventListeners.ContainsKey(eventName))
                    {
                        if (_eventListeners[eventName].Remove(mio))
                        {
                            if (_eventListeners[eventName].Count == 0)
                            {
                                _eventListeners.Remove(eventName);
                            }
                        }
                    }
                }
            }
        }
Пример #4
0
        /// <summary>
        /// Удалить все подписанные события
        /// </summary>
        /// <param name="obj">Объект</param>
        public void Remove(object obj)
        {
            foreach (var methodInfo in obj.GetType()
                     .GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
            {
                foreach (var attr in methodInfo.GetCustomAttributes(typeof(Bind), true))
                {
                    if (attr.GetType() != typeof(Bind))
                    {
                        continue;
                    }
                    var e         = (Bind)attr;
                    var eventName = e.EventName ?? methodInfo.Name;
                    if (eventName.Contains("{"))
                    {
                        eventName = Smart.Format(eventName, obj);
                    }
                    var mio = new MethodInfoObject {
                        Target = obj, Method = methodInfo
                    };

                    if (_eventListeners.ContainsKey(eventName))
                    {
                        if (_eventListeners[eventName].Remove(mio))
                        {
                            if (_eventListeners[eventName].Count == 0)
                            {
                                _eventListeners.Remove(eventName);
                            }
                        }
                    }
                }
            }

            var ii = 0;

            foreach (var value in _eventListeners.Values.Where(list => list.Any(moi => moi.Target == obj)))
            {
                value.RemoveAll(i => i.Target == obj);
                ii++;
            }

            if (ii > 0)
            {
                Log.Info($"removed {ii} events from {obj.GetType().Name}");
            }
        }
Пример #5
0
        private void Remove(MethodInfoObject mio, string newEventName = "")
        {
            string eventName = newEventName != "" ? newEventName : mio.Method.Name;

            if (mio.Method.GetCustomAttributes(typeof(Bind), true).Length > 0)
            {
                foreach (var attr in mio.Method.GetCustomAttributes(typeof(Bind), true))
                {
                    if (attr.GetType() != typeof(Bind))
                    {
                        continue;
                    }
                    var e = (Bind)attr;
                    eventName = newEventName != "" ? newEventName : e.EventName ?? mio.Method.Name;
                    if (_eventListeners.ContainsKey(eventName))
                    {
                        if (_eventListeners[eventName].Remove(mio))
                        {
                            if (_eventListeners[eventName].Count == 0)
                            {
                                _eventListeners.Remove(eventName);
                            }
                        }
                    }
                }
            }
            else
            {
                if (_eventListeners.ContainsKey(eventName))
                {
                    if (_eventListeners[eventName].Remove(mio))
                    {
                        if (_eventListeners[eventName].Count == 0)
                        {
                            _eventListeners.Remove(eventName);
                        }
                    }
                }
            }
        }
Пример #6
0
        protected void Add(Bind bind, MethodInfoObject mio, bool global = false, string realEventName = null)
        {
            if (bind.Global && !global)
            {
                Settings.GlobalModel.EventManager.Add(bind, mio, true, realEventName);
                return;
            }
            var eventName = !string.IsNullOrEmpty(realEventName) ? realEventName : bind.EventName ?? mio.Method.Name;

            if (eventName.Contains("{"))
            {
                eventName = Smart.Format(eventName, mio.Target);
            }

            if (!_eventListeners.ContainsKey(eventName))
            {
                _eventListeners.Add(eventName, new List <MethodInfoObject>());
            }
            if (!_eventListeners[eventName].Contains(mio))
            {
                _eventListeners[eventName].Add(mio);
            }
        }
Пример #7
0
 protected bool Equals(MethodInfoObject other)
 {
     return(Equals(Method, other.Method) && Equals(Target, other.Target));
 }
Пример #8
0
        private object[] ProcessSend(MethodInfoObject e, object[] args)
        {
            var methodParameters = e.Method.GetParameters();
            var send             = new object[methodParameters.Length];

            for (var i = 0; i < methodParameters.Length; i++)
            {
                send[i] = methodParameters[i].HasDefaultValue ? methodParameters[i].DefaultValue :  null;
            }

            for (var i = 0; i < Math.Min(args.Length, e.Method.GetParameters().Length); i++)
            {
                if (e.Method.GetParameters()[i].ParameterType == args[i].GetType())
                {
                    send[i] = args[i];
                }
                else
                {
                    //конвертируемые типы
                    if (methodParameters[i].ParameterType == typeof(object))
                    {
                        send[i] = args[i];
                    }
                    if (methodParameters[i].ParameterType == typeof(int))
                    {
                        if (args[i] is byte || args[i] is long || args[i] is double)
                        {
                            send[i] = Convert.ToInt32(args[i]);
                        }
                    }
                    if (methodParameters[i].ParameterType == typeof(long))
                    {
                        if (args[i] is byte || args[i] is int || args[i] is double)
                        {
                            send[i] = Convert.ToInt64(args[i]);
                        }
                    }
                    if (methodParameters[i].ParameterType == typeof(byte))
                    {
                        if (args[i] is int || args[i] is long || args[i] is double)
                        {
                            send[i] = Convert.ToByte(args[i]);
                        }
                    }
                    if (methodParameters[i].ParameterType == typeof(double))
                    {
                        if (args[i] is byte || args[i] is long || args[i] is int || args[i] is float)
                        {
                            send[i] = Convert.ToDouble(args[i]);
                        }
                    }
                    if (methodParameters[i].ParameterType == typeof(float))
                    {
                        if (args[i] is double)
                        {
                            try
                            {
                                send[i] = (float)args[i];
                            }
                            catch (InvalidCastException)
                            {
                            }
                        }
                    }
                    if (methodParameters[i].ParameterType == typeof(string))
                    {
                        send[i] = args[i] == null ? "" : args[i].ToString();
                    }
                }
            }
            return(send);
        }