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