给定一个对象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