using System; using System.Collections; using System.Collections.Generic; using System.Linq; namespace NHotkey.Wpf { class WeakReferenceCollection : IEnumerable where T : class { private readonly List _references = new List(); public IEnumerator GetEnumerator() { var references = _references.ToList(); foreach (var reference in references) { var target = reference.Target; if (target != null) yield return (T) target; } Trim(); } public void Add(T item) { _references.Add(new WeakReference(item)); } public void Remove(T item) { _references.RemoveAll(r => (r.Target ?? item) == item); } public void Trim() { _references.RemoveAll(r => !r.IsAlive); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } }