public virtual void AttachEvent(string eventName, IWeakEventTarget target) { bool eventFound = false; if (target != null) { for (int i = 0; i < _weakEvents.Length; i++) { if (string.Compare(eventName, _weakEvents[i], true) == 0) { eventFound = true; if (HasTarget(_listeners[i], target) == null) { _listeners[i].Add(new WeakReference(target)); if (_logger != null) { _logger(5, string.Format("WEAK_EVT_SRC {0}. Attmept to attach listener for event {1}... OK [target added]; Target ID = {2}", _sourceID, eventName, target.TargetFriendlyID)); } } else { if (_logger != null) { _logger(4, string.Format("WEAK_EVT_SRC {0}: Attmept to attach listener for event {1}... IGNORED [target already listening]; Target ID = {2}", _sourceID, eventName, target.TargetFriendlyID)); } } break; } } if (!eventFound && _logger != null) { _logger(2, string.Format("WEAK_EVT_SRC {0}: Attmept to attach listener for event {1}... FAILED [no such event]; Target ID = {2}", _sourceID, eventName, target.TargetFriendlyID)); } } }
private WeakReference HasTarget(IList<WeakReference> listeners, IWeakEventTarget target) { WeakReference r = null; for (int i = listeners.Count - 1; i >= 0; i--) { if (ReferenceEquals(listeners[i].Target, target)) { r = listeners[i]; break; } else if (!listeners[i].IsAlive || listeners[i].Target == null) { listeners.RemoveAt(i); } } return r; }
public virtual void DetachEvent(string eventName, IWeakEventTarget target) { if (target != null) { int targetRemoved = 0; for (int i = 0; i < _weakEvents.Length; i++) { if (string.Compare(eventName, _weakEvents[i], true) == 0) { WeakReference targetRef = null; do { targetRef = HasTarget(_listeners[i], target); if (targetRef != null) { _listeners[i].Remove(targetRef); targetRemoved++; } } while (_listeners[i].Count > 0 && targetRef != null); break; } } if (targetRemoved > 0) { if (_logger != null) { _logger(4, string.Format("WEAK_EVT_SRC {0}: Attmept to detach listener for event {1}... OK [target removed {2} time(s)]; Target ID = {3}", _sourceID, eventName, targetRemoved, target.TargetFriendlyID)); } } else { if (_logger != null) { _logger(2, string.Format("WEAK_EVT_SRC {0}: Attmept to detach listener for event {1}... FAILED [target did not exist or no such event]; Target ID = {2}", _sourceID, eventName, target.TargetFriendlyID)); } } } }