using System;
using System.Reflection;
namespace MiniCafe.Util
{
/// <summary>
/// this is the base class for singleton mode in csharp. Derived class must have a
/// privae or protected constructor without any parameters, otherwise exception will
/// be throwed.
/// </summary>
/// <typeparam name="T"></typeparam>
public class Singleton<T>
where T : class
{
private static T instance;
/// <summary>
/// instace property of class T
/// </summary>
public static T Instance
{
get
{
if (instance == null)
{
lock (typeof(T))
{
if (instance == null)
{
ConstructorInfo constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[0], new ParameterModifier[0]);
if (constructor == null)
throw new Exception("The object that you want to singleton doesnt have a private/protected constructor so the property cannot be enforced.");
try
{
instance = constructor.Invoke(new object[0]) as T;
}
catch (Exception e)
{
throw new Exception("The Singleton couldnt be constructed, check if the type T has a default constructor", e);
}
}
}
}
return instance;
}
}
}
}