【发布时间】:2010-07-18 01:25:38
【问题描述】:
获取表达式树并将其转换为其他形式是相当普遍的,例如字符串表示形式(例如this question 和this question,我怀疑 Linq2Sql 会做类似的事情)。
在许多情况下,甚至可能是大多数情况下,表达式树转换总是相同的,即如果我有一个函数
public string GenerateSomeSql(Expression<Func<TResult, TProperty>> expression)
那么任何具有相同参数的调用将始终返回相同的结果,例如:
GenerateSomeSql(x => x.Age) //suppose this will always return "select Age from Person"
GenerateSomeSql(x => x.Ssn) //suppose this will always return "select Ssn from Person"
因此,本质上,带有特定参数的函数调用实际上只是一个常数,除了在运行时不断地重新计算它会浪费时间。
假设,为了论证,转换足够复杂,导致明显的性能损失,有没有办法将函数调用预编译成实际的常量?
编辑 似乎没有办法在 C# 本身内完全做到这一点。您可能在 c# 中最接近的可能是接受的答案(尽管您当然要确保缓存本身不比重新生成慢)。要实际转换为真正的常量,我怀疑通过一些工作,您可以使用 mono-cecil 之类的东西在编译后修改字节码。
【问题讨论】: