缓存反射属性getter / setter的最佳方式

本文关键字:最佳 方式 setter 反射 属性 getter 缓存 | 更新日期: 2023-09-27 18:13:15

我知道反射是很昂贵的。我有一个获得/设置属性的类,我认为一种方法是以某种方式缓存反射。我不确定是否应该缓存表达式,或者这里应该做什么。这是我目前正在做的:

typeof(T).GetProperty(propName).SetValue(obj, value, null);
typeof(T).GetProperty(propName).GetValue(obj, null);

所以…有什么最好的方法能让它更快呢?

缓存反射属性getter / setter的最佳方式

应该缓存

的结果
typeof(T).GetProperty(propName); 

typeof(T).GetProperty(propName);

另一种可能的方法是组合PropertyInfo。GetGetMethod方法(或PropertyInfo. properties)。GetSetMethod用于setter和Delegate的方法。CreateDelegate方法,并在每次需要获取/设置值时调用结果委托。如果您需要它来处理泛型,您可以使用这个问题中的方法:具有未知类型的CreateDelegate

这应该比反射快得多:让反射飞起来,探索委托

还有其他方法可以更快地获取/设置值。您可以使用表达式树或DynamicMethod在运行时生成文件。看看这些链接:

使用DynamicMethod的后绑定调用

委托。CreateDelegate vs DynamicMethod vs Expression

嗯,最简单的答案是您可以缓存GetProperty返回的PropertyInfo对象:

var propInfo = typeof(T).GetProperty(propName);
propInfo.SetValue(obj, value, null);
propInfo.GetValue(obj, null);
// etc.

这将消除反射在类中重复查找属性的需要,并消除大部分性能损失。

Marc Gravell写了一篇关于他的HyperDescriptor的精彩文章。它应该提供更快的运行时反射属性访问。

仅存储对PropertyInfo的引用,该引用来自:

typeof(T).GetProperty(propName)