目前我正在使用表达式树来获取属性的名称。
public static string GetPropertyName<T, TReturn>(Expression<Func<T, TReturn>> expression)
{
MemberExpression body = (MemberExpression)expression.Body;
return body.Member.Name;
}
我看到他们在某处使用表达式的字符串版本(expression.toString())将其缓存在字典中,然后第二次从缓存中获取属性名称。
这实际上有帮助还是有更好的方法?
答案 0 :(得分:3)
这取决于你的意思“有帮助”。
这种缓存背后的想法是它比检查表达式更快。我对此的第一反应是“可能会更慢”,但99%的时间这样直观的猜测是错误的,所以我们暂时忽略它。
缓存是一种权衡。您将引入内存开销(对于字典),加上创建字典的运行时成本,在希望中ToString
加字典查找操作将比检查表达式更快值得花费(加上复杂性增加)。即使这是真的,更快的查找也无关紧要 ,除非你在某个大循环中这样做。在你的情况下是真的吗?如果没有,你不应该打扰。
现在,如果您正在编写通用库,则不会知道该库的用户如何选择使用它。也许其中一些人确实会在循环中进行此类调用。在这种情况下,覆盖你的背部并尝试缓存可能是个好主意; 但是,如果一个不太可能出现的情况更糟糕,那么对于不太可能的情况实施缓存仍然是一个糟糕的决定。
当然,判断缓存是好还是坏应该总是通过测量来完成。
答案 1 :(得分:2)
http://msdn.microsoft.com/en-us/magazine/cc163759.aspx
快速&amp;光反射功能
成本高昂的反映功能