泛型单例

来源:互联网 发布:华为如何开数据流量 编辑:程序博客网 时间:2024/06/13 04:51
using System;using System.Linq;using System.Reflection;namespace Netson.IHWMS.Desktop{    public abstract class SingleInstance<T>    {        //线程安全单例        private static readonly object Lock = new object();        private static T _instance;        public static T Instance        {            get            {                if (_instance != null) return _instance;                lock (Lock)                {                    _instance = Single.Value;                }                return _instance;            }        }        //生成泛型单例        private static Lazy<T> Single { get; } = new Lazy<T>(() =>        {            var ctors = typeof(T).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);            if (ctors.Length != 1)            {                throw new InvalidOperationException($"类型 {typeof(T)} 必须有一个构造函数.");            }            /* 搜索限定为私有无参数构造            var ctor = ctors.SingleOrDefault(c => !c.GetParameters().Any() && c.IsPrivate);            if (ctor == null)            {                throw new InvalidOperationException($"类型 {typeof(T)} 的构造函数必须为私有或不提供参数.");            }            */            var ctor = ctors.SingleOrDefault();            if (ctor == null)            {                throw new InvalidOperationException($"类型 {typeof(T)} 未找到,无法构造.");            }            return (T)ctor.Invoke(null);        });    }}

原创粉丝点击