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

标签 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);

我希望能够将它们编译成等同于以下内容的方法/委托(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/

相关文章:

c# - ASP.NET MVC Razor 在 foreach 中设置样式属性

c# - 与.NET中的IIS SMTP服务器进行有意义的交互

c# - FirstOrDefaultAsync() & SingleOrDefaultAsync() 与 FindAsync() EFCore

c# - Evaluator.PartialEval 减少提供的表达式

c# - LINQ to entities - 构建 where 子句以测试多对多关系中的集合

python - 在 Python 中部分应用的高效方法?

c# - 以正确的顺序获取 chrome 标签

asp.net - linq 求和与分组

c# - 用 lambda 表达式替换委托(delegate)

c# - 检查列表中的所有值是否相等