缓存反射属性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);
所以…有什么最好的方法能让它更快呢?
应该缓存
的结果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)