C#反射破坏单例

单例大家都不陌生,程序从开启到死亡过程中只能存在一个实例,即存在不可创建,今天给大家介绍一种打破这种模式的方法,在程序运行中创建无数个单例实例对象。

关于单例模式模糊或者不懂的可以参考C#单例模式

上文我们讲到了反射的基本操作,实例化对象、属性、方法、特性等操作,可以参考C#反射

 咱们切入正题,单例有两种,一种是程序加载时创建,一种是使用时创建,我们这里主要是创建一个加载时创建的单例。我们通过反射来破坏这个单例,创建单例对象

反射破坏单例

class SingLeton
{
    private static SingLeton inntleton = null;
    private ArrayList stlit = null;
    //私有构造函数
    private SingLeton()
    { }

    public static SingLeton singl()
    {
        if (inntleton == null)
        {
            inntleton = new SingLeton();

        }
        return inntleton;
    }
}

然后通过反射创建这个单例对象并且对比

//调用私有方法构造函数
var ass = Assembly.Load("TextCord");
var type = ass.GetType("TextCord.SingLeton");
var singletonCreate = Activator.CreateInstance(type, true);
var singleton = SingLeton.singl();

Console.WriteLine(object.ReferenceEquals(singleton, SingLeton.singl()));//true
Console.WriteLine(object.ReferenceEquals(singleton, singletonCreate));//false

反射调用泛型

class GenClass<T>
{
    public void Note(T t)
    {
        Console.WriteLine(t);
    }
}

调用

var ass = Assembly.Load("TextCord");
//反射调用泛型
var type_q = ass.GetType("TextCord.GenClass`1");
var typeMake = type_q.MakeGenericType(new Type[] { typeof(string) });
var genclass = Activator.CreateInstance(typeMake);
var note = typeMake.GetMethod("Note",new Type[] { typeof(string)});
note.Invoke(genclass, new object[] { "3333"});

这里有几个重要的部分

我们在获取这个泛型的时候后面跟一些字符"`1",那么这个是什么意思呢?其实这个就是我们编译代码成il的时候,系统指定的一个类似占位符的东西,一般来说一个参数就是"`1",TClass<T,U>两个就是"`2"。

第二个注意的地方就是,我们初始化这个T的时候需要调用一下MakeGenericType()方法,用于初始化类型T,就好像我们new一样

//如同这样
var genClass = new GenClass<string>();

第三个主要的就是,我们动态调用方法,我们一般在CreateInstance的时候就是创建反射对象的实例,通过强转或者使用动态类型调用方法,这里我们是通过动态的方式调用,示例如下

//反射调用泛型
var type_q = ass.GetType("TextCord.GenClass`1");
var typeMake = type_q.MakeGenericType(new Type[] { typeof(string) });
var genclass = Activator.CreateInstance(typeMake);
var note = typeMake.GetMethod("Note",new Type[] { typeof(string)});
note.Invoke(genclass, new object[] { "3333"});
//强转
GenClass<string> y = (GenClass<string>)Activator.CreateInstance(typeMake);
y.Note("yyyyy");
//动态类型
dynamic d = Activator.CreateInstance(typeMake);
d.Note("ddddd");

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值