优化System.Reflection.MemberInfo存储

优化System.Reflection.MemberInfo类型的存储

简述

在使用反射的过程中,有可能会涉及到将反射到的MemberInfo进行保存,以便后续进行调用。在存储这些对象的过程中,可以采用绑定句柄减少内存的消耗。

Type优化

Type实例的优化,通过采用RuntimeTypeHandle与Type互转实现

public void OptimizeType()
{
    //首先获取类型对象
    Type type = typeof(int);

    //优化!
    //获取绑定句柄
    RuntimeTypeHandle handle = type.TypeHandle;


    //使用时只需要将句柄转换为Type即可
    Type typeFromHandle = Type.GetTypeFromHandle(handle);

    //验证是否正确
    Console.WriteLine(type == typeFromHandle);
}

FieldInfo优化

通过FieldInfo与RuntimeFieldHandle互转实现

public class Person
{
    public string name;
}

public void OptimizeField()
{
    //获取类型
    Type type = typeof(Person);

    //利用反射获取字段信息
    FieldInfo finfo = type.GetField("name");

    //获取字段的句柄
    RuntimeFieldHandler handler = finfo.FieldHandle;

    //将句柄转换为字段信息
    FieldInfo finfoFromHandle = FieldInfo.GetFieldFromHandle(handler);

    //验证是否正确
    Console.WriteLine(finfo == finfoFromHandle);
}

MethodInfo优化

通过RuntimeMethodHandle与MethodInfo互转实现优化

public class Person
{
    public void Greet(){}
}

public void OptimizeMethod()
{
    //获取类型
    Type type = typeof(Person);

    //获取方法信息
    MethodInfo minfo= type.GetMethod("Greet");

    //获取方法信息的句柄
    RuntimeMethodHandle handle = minfo.MethodHandle;

    //使用时可以再将句柄转换为MethodInfo
    MethodInfo minfoFromHandle = MethodInfo.GetMethodFromHandle(handle);

    //验证转换之后的方法是否正确
    Console.WriteLine(minfo == minfoFromHandle);
}

EventInfo、PropertyInfo优化

.Net并没有为EventInfo、PropertyInfo提供对应的绑定句柄,但是可以通过分别优化其Get/Set方法来实现。
EventInfo对应的是EventInfo.GetAddMethod,EventInfo.GetRemoveMethod
PropertyInfo对应的分别是PropertyInfo.GetGetMethod,PropertyInfo.GetSetMethod
具体优化方法参照MethodInfo优化

持久化保存

RuntimeTypeHandle、RuntimeMethodHandle、RuntimeFieldHandle都实现了ISerializable接口,所以可以通过序列化/反序列化进行保存和读取,需要注意的是,反序列化得到的对象分别是Type、MethodInfo、FieldInfo类型对象,而非句柄。反序列化后的字节长度不比Type、MethodInfo、FieldInfo序列化之后小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值