假设我有以下表达式:
Expression<Action<T, StringBuilder>> expr1 = (t, sb) => sb.Append(t.Name);
Expression<Action<T, StringBuilder>> expr2 = (t, sb) => sb.Append(", ");
Expression<Action<T, StringBuilder>> expr3 = (t, sb) => sb.Append(t.Description);
我希望能够将它们编译成等同于以下内容的方法/委托(delegate):
void Method(T t, StringBuilder sb)
{
sb.Append(t.Name);
sb.Append(", ");
sb.Append(t.Description);
}
解决这个问题的最佳方法是什么?我希望它表现良好,理想情况下性能与上述方法相当。
更新 因此,虽然似乎无法在 C#3 中直接执行此操作,但有没有办法将表达式转换为 IL,以便我可以将其与 System.Reflection.Emit 一起使用?
最佳答案
不幸的是,在 .NET 3.5 中,您无法构建执行一系列任意操作的表达式。以下是支持的表达式列表:
- 算术:加法、AddChecked、除法、模数、乘法、MultiplyChecked、求反、NegateChecked、幂、减法、SubtractChecked、UnaryPlus
- 创建:Bind、ElementInit、ListBind、ListInit、MemberBind、MemberInit、New、NewArrayBounds、NewArrayInit
- 按位:与、异或、左移 (<<)、非、或、右移 (>>)
- 逻辑:AndAlso (&&)、Condition (? :)、Equal、GreaterThan、GreaterThanOrEqual、LessThan、* LessThanOrEqual、NotEqual、OrElse (||)、TypeIs
- 成员访问:ArrayIndex、ArrayLength、Call、Field、Property、PropertyOrField
- 其他:Convert、ConvertChecked、Coalesce (??)、Constant、Invoke、Lambda、Parameter、TypeAs、Quote
.NET 4 通过添加以下表达式扩展了此 API:
- 突变:AddAssign、AddAssignChecked、AndAssign、Assign、DivideAssign、ExclusiveOrAssign、LeftShiftAssign、ModuloAssign、MultiplyAssign、MultiplyAssignChecked、OrAssign、PostDecrementAssign、PostIncrementAssign、PowerAssign、PreDecrementAssign、PreIncrementAssign、RightShiftAssign、SubtractAssigned、SubtractAs
- 算术:递减、默认、递增、补码
- 成员访问:ArrayAccess、动态
- 逻辑:ReferenceEqual、ReferenceNotEqual、TypeEqual
- 流程:Block、Break、Continue、Empty、Goto、IfThen、IfThenElse、IfFalse、IfTrue、Label、Loop、Return、Switch、SwitchCase、Unbox、Variable
- 异常(exception): catch 、重新 throw 、 throw
- 调试:ClearDebugInfo、DebugInfo
Block表达特别有趣。
关于c# - 如何将多个表达式组合成一个快速方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2419020/