如何将多个表达式组合成一个快速方法?

chi*_*tom 6 c# linq lambda dynamicmethod

假设我有以下表达式:

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);
Run Code Online (Sandbox Code Playgroud)

我希望能够将这些编译成与以下内容等效的方法/委托:

void Method(T t, StringBuilder sb) 
{
    sb.Append(t.Name);
    sb.Append(", ");
    sb.Append(t.Description);
}
Run Code Online (Sandbox Code Playgroud)

解决这个问题的最佳方法是什么?我希望它表现良好,理想情况下性能与上述方法相当.

更新 所以,虽然似乎没有办法在C#3中直接执行此操作,有没有办法将表达式转换为IL,以便我可以将它与System.Reflection.Emit一起使用?

Dar*_*rov 4

不幸的是,在 .NET 3.5 中,您无法构建执行一系列任意操作的表达式。以下是支持的表达式列表:

  • 算术:加、AddChecked、除、模、乘、MultiplyChecked、求反、NateChecked、幂、减、SubtractChecked、UnaryPlus
  • 创建:Bind、ElementInit、ListBind、ListInit、MemberBind、MemberInit、New、NewArrayBounds、NewArrayInit
  • 按位:与、异或、左移 (<<)、非、或、右移 (>>)
  • 逻辑:AndAlso (&&)、条件 (? :)、等于、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、SubtractAssign、SubtractAssignChecked
  • 算术:递减、默认、递增、补码
  • 成员访问:ArrayAccess、动态
  • 逻辑:ReferenceEqual、ReferenceNotEqual、TypeEqual
  • 流程:块、中断、继续、空、转到、IfThen、IfThenElse、IfFalse、IfTrue、标签、循环、返回、Switch、SwitchCase、拆箱、变量
  • 例外:捕获、重新抛出、抛出
  • 调试:清除调试信息、调试信息

Block表达式特别有趣。