private static EventListenerList CreateWeakListener(object target, object state) { var eventInfo = (EventInfo)state; var listenerInternal = new EventListenerList(); object handler = eventInfo.EventHandlerType == typeof(EventHandler) ? new EventHandler(listenerInternal.Raise) : ServiceProvider.ReflectionManager.TryCreateDelegate(eventInfo.EventHandlerType, listenerInternal, EventListenerList.RaiseMethod); if (handler == null) { return(EventListenerList.EmptyListener); } #if NET_STANDARD var addMethod = eventInfo.AddMethod; #else var addMethod = eventInfo.GetAddMethod(true); #endif if (addMethod == null) { return(EventListenerList.EmptyListener); } addMethod.InvokeEx(target, handler); return(listenerInternal); }
private static EventListenerList CreateContextListener(object src, object state) { var context = (IBindingContext)state; var listenerInternal = new EventListenerList(); context.ValueChanged += listenerInternal.Raise; return(listenerInternal); }
public void Dispose() { EventListenerList listener = _eventListener; var weakItem = _weakItem; if (listener != null && !weakItem.IsEmpty) { _eventListener = null; _weakItem = WeakEventListenerWrapper.Empty; listener.Remove(weakItem); } }
private IDisposable AddInternal(WeakEventListenerWrapper weakItem, string path) { lock (this) { if (_listeners.Length == 0) { _listeners = new[] { new KeyValuePair <WeakEventListenerWrapper, string>(weakItem, path) }; _size = 1; _removedSize = 0; } else { if (_removedSize == 0) { if (_size == _listeners.Length) { EventListenerList.EnsureCapacity(ref _listeners, _size, _size + 1); } _listeners[_size++] = new KeyValuePair <WeakEventListenerWrapper, string>(weakItem, path); } else { for (int i = 0; i < _size; i++) { if (_listeners[i].Key.IsEmpty) { _listeners[i] = new KeyValuePair <WeakEventListenerWrapper, string>(weakItem, path); --_removedSize; break; } } } } } return(new Unsubscriber(this, weakItem, path)); }
static EventListenerList() { RaiseMethod = typeof(EventListenerList).GetMethodEx(nameof(Raise), MemberFlags.Public | MemberFlags.Instance); EmptyListener = new EventListenerList(true); }
public Unsubscriber(EventListenerList eventListener, WeakEventListenerWrapper weakItem) { _eventListener = eventListener; _weakItem = weakItem; }