A simple C# generic singleton class

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, nullnew 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;
            }

        }

    }

}


原文地址:https://www.cnblogs.com/swnuwangyun/p/556827.html