namespace InnovEnergy.Lib.Utils; public class Disposable : IDisposable { private Action? _Dispose; public Disposable(Action dispose) { _Dispose = dispose; } public void Dispose() => Interlocked.Exchange(ref _Dispose, null)?.Invoke(); public static Disposable Create(T t, Action dispose) => new Disposable(t, dispose); } public class Disposable : IDisposable { private Action? _Dispose; private readonly T _Value; public T Value { get { if (_Dispose == null) throw new ObjectDisposedException(nameof(Disposable)); return _Value; } } public Disposable(T t, Action dispose) { _Dispose = dispose; _Value = t; } public void Dispose() => Interlocked.Exchange(ref _Dispose, null)?.Invoke(); public Disposable BeforeDisposeDo(Action action) { return new Disposable(Value, () => { action(); Dispose(); }); } public static implicit operator T(Disposable t) => t.Value; public override String ToString() => Value?.ToString() ?? ""; }