缓存反射属性获取器/设置器的最佳方法?
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)
【讨论】:
以上是关于缓存反射属性获取器/设置器的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章