c#反射获取单例对象的实例

Posted lonelyrains

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#反射获取单例对象的实例相关的知识,希望对你有一定的参考价值。

object obj = null;
if (classItem.BaseType.Name == "Singleton`1")

	obj = classItem.BaseType.GetProperty("Instance").GetValue(null);

else

	obj = Activator.CreateInstance(classItem);

反射创建实例,最常用的是在插件加载时。如果这个类是单例模式的,再使用CreateInstance,不会直接调用Instance的那个实例,而是又创建了一个。会出现明明应该单例调用的地方,数据不一致的情况。

此时,就需要了解怎么反射调用Instance实例。

 

假设单例模板如下:

// 本单例模板代码来自https://www.cnblogs.com/zhouzl/archive/2019/04/11/10687909.html
public abstract class Singleton<T> where T : class

    // 这里采用实现5的方案,实际可采用上述任意一种方案
    class Nested
    
        // 创建模板类实例,参数2设为true表示支持私有构造函数
        internal static readonly T instance = Activator.CreateInstance(typeof(T), true) as T;
    
    private static T instance = null;
    public static T Instance  get  return Nested.instance;  


 

以上是关于c#反射获取单例对象的实例的主要内容,如果未能解决你的问题,请参考以下文章

详解单例模式

单例模式反射序列化漏洞及解决方案!

C#反射实例学习及注意内容

设计模式-单例设计模式

详解C#特性和反射

单例模式_反射破坏单例模式_枚举类_枚举类实现单例_枚举类解决单例模式破坏