What do you guys think about this for a generic singleton?
using System; using System.Reflection; // Use like this /* public class Highlander : Singleton<Highlander> { private Highlander() { Console.WriteLine('There can be only one...'); } } */ public class Singleton<T> where T : class { private static T instance; private static object initLock = new object(); public static T GetInstance() { if (instance == null) { CreateInstance(); } return instance; } private static void CreateInstance() { lock (initLock) { if (instance == null) { Type t = typeof(T); // Ensure there are no public constructors... ConstructorInfo[] ctors = t.GetConstructors(); if (ctors.Length > 0) { throw new InvalidOperationException(String.Format('{0} has at least one accesible ctor making it impossible to enforce singleton behaviour', t.Name)); } // Create an instance via the private constructor instance = (T)Activator.CreateInstance(t, true); } } } }
Creating a singleton class is just a few lines of code, and with the difficulty of making a generic singleton i always write those lines of code.
The
line removes the need for locking, as a static constructor is thread safe.