public object this[string name] { get { if (_SpecialGetters.TryGetValue(name, out Func <TTarget, object> cb) || Getters.TryGetValue(name, out cb)) { return(cb(Weak?.SafeGetTarget() as TTarget)); } if (Data.TryGetValue(name, out object value)) { return(value); } return(null); } set { if (_SpecialSetters.TryGetValue(name, out Action <TTarget, object> cb) || Setters.TryGetValue(name, out cb)) { cb(Weak?.SafeGetTarget() as TTarget, value); return; } object prev; if (_Data.Disposable.Contains(name) && (prev = this[name]) != null && prev is IDisposable prevDisposable) { prevDisposable.Dispose(); } Data[name] = value; } }