缓存reflection属性getter / setter的最佳方法是什么?

我知道反思可能很昂贵。 我有一个经常获取/设置属性的类,我想到的一种方法是以某种方式缓存reflection。 我不确定我是否应该缓存表达式或者在这里做什么。 这就是我目前正在做的事情:

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方法 (或用于setter的PropertyInfo.GetSetMethod方法 )与Delegate.CreateDelegate方法结合使用,并在每次需要获取/设置值时调用生成的委托。 如果您需要使用generics,可以使用此问题的方法: CreateDelegate包含未知类型

与reflection相比,这应该快得多: 使reflection飞行并探索代表

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

使用DynamicMethod进行后期绑定调用

Delegate.CreateDelegate与DynamicMethod vs Expression

好吧,最简单的答案是你可以缓存GetProperty返回的PropertyInfo对象:

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

这样就不需要reflection来重复找到类中的属性并消除大部分性能损失。

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

只需存储对从以下位置返回的PropertyInfo的引用:

 typeof(T).GetProperty(propName)