c# - 有没有办法让这个 "GetPropertyName"函数更快?

标签 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()) 将其缓存在字典中,然后第二次从缓存中获取属性名称。

这真的有帮助还是有更好的方法?

最佳答案

这取决于您所说的“有帮助”是什么意思。

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

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

现在,如果您正在编写一个通用库,您将不知道该库的用户如何选择使用它。也许他们中的一些人确实会在循环中进行这样的调用。在这种情况下,掩护并尝试缓存可能是个好主意; 但如果为不太可能发生的情况实现缓存会使您更可能发生的情况变得更糟,这仍然是一个错误的决定

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

关于c# - 有没有办法让这个 "GetPropertyName"函数更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5225146/

相关文章:

C# 在标题栏中隐藏标题

c# - 自定义工具错误 : Failed to generate file

visual-studio - 如何将 Visual Studio 2013 更新 4 升级到更新 5?

c# - CopyAndUpdateAssertion - I/O 不匹配

c# - 如何在.net紧凑框架中播放mp3文件

java - Android通过反射重写私有(private)方法

C# 使用反射访问窗口属性

java - 查找具有通用参数的构造函数

c#-4.0 - 在 .net 中使用 IKVM 的 ANNIE 门命名实体

.net:从Excel工作表动态生成SQL数据库中的表