using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace JD.Kernel.Classes
{
///
/// Simple class that implements IDisposable using a delegate.
///
///
/// Can be useful to implement a "using pattern" without defining a nested class.
///
///
///
/// public class MyClass
/// {
/// public IDisposable Start()
/// {
/// return new DisposableHelper(delegate
/// {
/// // ... End code.
/// });
/// }
/// }
///
/// using (MyClass.Start())
/// {
/// ...
/// }
///
///
public class DisposableHelper : IDisposable
{
private Action m_disposeAction;
///
/// Ctor.
///
/// Action to execute on dispose (if null, empty action).
public DisposableHelper(Action disposeAction)
{
m_disposeAction = disposeAction;
}
#region IDisposable Members
///
/// Executes its dispose operation.
///
[DebuggerStepThrough]
public void Dispose()
{
Action disposeAction = m_disposeAction;
m_disposeAction = null;
if (disposeAction != null)
{
disposeAction();
}
}
#endregion
#region Functions
///
/// Disposes the value if not null.
///
///
public static void SafeDispose(IDisposable value)
{
if (value != null)
{
value.Dispose();
}
}
///
/// Disposes the value if not null.
///
///
public static void SafeDisposeList(IEnumerable list)
where T : IDisposable
{
if (list == null)
{
return;
}
foreach (var item in list)
{
SafeDispose(item);
}
}
public static void SafeDisposeAndClearList(ICollection list)
where T : IDisposable
{
if (list == null)
{
return;
}
foreach (var item in list)
{
SafeDispose(item);
}
list.Clear();
}
///
/// Disposes the value if not null.
///
///
public static void SafeDispose(T value)
where T : IDisposable
{
if (!Equals(value, null))
{
value.Dispose();
}
}
///
/// Disposes the value if not null and sets it to null.
///
///
public static void SafeDispose(ref T value)
where T : IDisposable
{
if (!Equals(value, null))
{
// value will still be default(T) even if implementation of Dispose accesses value!
T temp = value;
value = default(T);
temp.Dispose();
}
}
#endregion
}
}