using System; namespace ln.types { class WeakHashValue where T:class { readonly int keyHashCode; WeakReference reference; public T Value => reference.TryGetTarget(out T target) ? target : null; public bool IsStrong => reference.TryGetTarget(out T target); public WeakHashValue(T value) { reference = new WeakReference(value); keyHashCode = value.GetHashCode(); } public override int GetHashCode() => keyHashCode; public override bool Equals(object obj) { T value = Value; if ((value != null) && (obj is WeakHashValue)) { WeakHashValue other = obj as WeakHashValue; return object.Equals(value,other.Value); } return false; } } }