缓存反射属性获取器/设置器的最佳方法?

Posted

技术标签:

【中文标题】缓存反射属性获取器/设置器的最佳方法?【英文标题】:Best way to cache a reflection property getter / setter? 【发布时间】:2011-12-21 10:17:13 【问题描述】:

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

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

那么...什么是加快速度的最佳方法?

【问题讨论】:

【参考方案1】:

你应该缓存

的结果
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,如果你想要最好的表现,代表是要走的路 代表似乎是要走的路,但那篇文章有点过头了。你能举一个关于我用它做什么的例子吗? 你说“你应该缓存X和Y的结果”,但是X和Y是一回事?【参考方案2】:

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

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

// etc.

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

typeof(T).GetProperty(propName)

【讨论】:

以上是关于缓存反射属性获取器/设置器的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

c#的属性和反射,大约是啥回事

java反射获取属性值

缓存反射结果(类属性)

反射常见方法

java反射机制动态获取hibernate懒加载对象

Android反射设置和获取系统属性