当前位置: 代码迷 >> 综合 >> 优化System.Reflection.MemberInfo存储
  详细解决方案

优化System.Reflection.MemberInfo存储

热度:11   发布时间:2024-01-10 07:34:43.0

优化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;//使用时可以再将句柄转换为MethodInfoMethodInfo 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序列化之后小。

  相关解决方案