目前我正在使用表达式树来获取属性的名称。
public static string GetPropertyName<T, TReturn>(Expression<Func<T, TReturn>> expression)
{
MemberExpression body = (MemberExpression)expression.Body;
return body.Member.Name;
}
我在某处看到他们使用表达式的字符串版本 (expression.toString()) 将其缓存在字典中,然后第二次从缓存中获取属性名称。
这真的有帮助还是有更好的方法?
最佳答案
这取决于您所说的“有帮助”是什么意思。
这种缓存背后的想法是它比检查表达式更快。我对此的第一 react 是“那可能会更慢”,但 99% 的时候这种直觉猜测是错误的,所以我们暂时忽略它。
缓存是一种权衡。您将引入内存开销(对于字典),加上创建字典的运行时成本,希望 ToString
加上字典查找操作将比检查表达式是否值得成本(加上增加的复杂性)。即使这是真的,更快的查找根本也无关紧要,除非您在某个地方的大循环中这样做。你的情况是这样吗?如果没有,你不应该打扰。
现在,如果您正在编写一个通用库,您将不知道该库的用户如何选择使用它。也许他们中的一些人确实会在循环中进行这样的调用。在这种情况下,掩护并尝试缓存可能是个好主意; 但如果为不太可能发生的情况实现缓存会使您更可能发生的情况变得更糟,这仍然是一个错误的决定。
当然,判断缓存是好是坏应该始终通过测量来完成。
关于c# - 有没有办法让这个 "GetPropertyName"函数更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5225146/