有没有办法让这个“GetPropertyName”功能更快?

时间:2011-03-07 20:56:30

标签: c# reflection c#-4.0 expression

目前我正在使用表达式树来获取属性的名称。

public static string GetPropertyName<T, TReturn>(Expression<Func<T, TReturn>> expression)
{
     MemberExpression body = (MemberExpression)expression.Body;
     return body.Member.Name;
}

我看到他们在某处使用表达式的字符串版本(expression.toString())将其缓存在字典中,然后第二次从缓存中获取属性名称。

这实际上有帮助还是有更好的方法?

2 个答案:

答案 0 :(得分:3)

这取决于你的意思“有帮助”。

这种缓存背后的想法是它比检查表达式更快。我对此的第一反应是“可能会更慢”,但99%的时间这样直观的猜测是错误的,所以我们暂时忽略它。

缓存是一种权衡。您将引入内存开销(对于字典),加上创建字典的运行时成本,在希望ToString加字典查找操作将比检查表达式更快值得花费(加上复杂性增加)。即使这是真的,更快的查找也无关紧要 ,除非你在某个大循环中这样做。在你的情况下是真的吗?如果没有,你不应该打扰。

现在,如果您正在编写通用库,则不会知道该库的用户如何选择使用它。也许其中一些人确实会在循环中进行此类调用。在这种情况下,覆盖你的背部并尝试缓存可能是个好主意; 但是,如果一个不太可能出现的情况更糟糕,那么对于不太可能的情况实施缓存仍然是一个糟糕的决定。

当然,判断缓存是好还是坏应该总是通过测量来完成。

答案 1 :(得分:2)

反思:躲避制作快速应用程序的常见性能缺陷

http://msdn.microsoft.com/en-us/magazine/cc163759.aspx

快速&amp;光反射功能

  • typeof运算
  • Object.GetType
  • typeof == Object.GetType
  • 类型等价API(包括类型句柄运算符重载)
  • get_Module
  • get_MemberType
  • 一些IsXX谓词API
  • .NET Framework 2.0中的新令牌/句柄解析API

成本高昂的反映功能

  • GetXX API(MethodInfo,PropertyInfo,FieldInfo等)
  • GetCustomAttributes
  • Type.InvokeMember
  • 调用API(MethodInfo.Invoke,FieldInfo.GetValue等)
  • get_Name(名称属性)
  • Activator.CreateInstance