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

时间:2011-11-03 17:55:46

标签: c# performance caching reflection properties

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

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

那么......什么才能让这个更快?

4 个答案:

答案 0 :(得分:10)

您应该缓存

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

typeof(T).GetProperty(propName);

另一种可能的方法是将PropertyInfo.GetGetMethod Method (或PropertyInfo.GetSetMethod Method 用于setter)与Delegate.CreateDelegate Method 结合使用,并在每次需要获取/设置值时调用生成的委托。如果您需要使用泛型,可以使用此问题的方法:CreateDelegate with unknown types

与反射相比,这应该快得多: Making reflection fly and exploring delegates

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

Late-Bound Invocations with DynamicMethod

Delegate.CreateDelegate vs DynamicMethod vs Expression

答案 1 :(得分:3)

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

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

// etc.

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

只需存储对以下内容返回的PropertyInfo的引用:

typeof(T).GetProperty(propName)