缓存反射查找



给定一个对象o,以及一个名为s的成员,其中s是一个字符串,我们可以使用反射来获取名为s内容的o字段。

作为此过程的一部分,大概我们需要查找该类的一些元数据表,以确定该字段是否存在以及它相对于该类的对象基的位置。

但在那之后,假设同一类的所有对象都具有相同的布局,我们就不必再次使用反射。现在,我们已经获得了字段与基数的偏移量,我们可以在该类的任何其他对象的正确位置进行指针添加。

那么,是否有任何方法可以"保存"反射查找的结果,以便它们可以在相同类型的不同对象上重用?

像这样的东西?

public class FieldReader<T> {
private FieldInfo[] _fields;
public FieldReader() {
var theType = typeof(T);
_fields = theType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
}
public void ShowFieldValuesforObject(T obj) {
foreach (var field in _fields) {
var val = field.GetValue(obj);
Debug.WriteLine($"{field.Name}: {val}");
}
}
}

你可以像这样使用它:

public class TestClass {
private int _age;
public string _name;
public TestClass(int age, string name) {
_name = name;
_age = age;
}
public static void Test() {
var fieldReader = new FieldReader<TestClass>();
var obj1 = new TestClass(12, "Angie");
var obj2 = new TestClass(42, "Bob");
Debug.WriteLine("Angie:");
fieldReader.ShowFieldValuesforObject(obj1);
Debug.WriteLine("Bob:");
fieldReader.ShowFieldValuesforObject(obj2);
}
}

如果我打电话给TestClass.Test(),我看到这个:

Angie:
_age: 12
_name: Angie 
Bob:
_age: 42
_name: Bob

最新更新