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); } } }
/// <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); } } }
/// <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); } } } } } }
/// <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}"); } }
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); } } } } }
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); } }
protected bool Equals(MethodInfoObject other) { return(Equals(Method, other.Method) && Equals(Target, other.Target)); }
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); }