优化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序列化之后小。