可以通过在表达式树中嵌入 IL 代码来提高执行速度。下面是一个示例:
using System;
using System.Linq.Expressions;
using System.Reflection.Emit;
class Program
{
static void Main(string[] args)
{
// 创建一个简单的表达式树:a + b + c
var a = Expression.Parameter(typeof(int));
var b = Expression.Parameter(typeof(int));
var c = Expression.Parameter(typeof(int));
var add = Expression.Add(a, b);
var add2 = Expression.Add(add, c);
var lambda = Expression.Lambda>(add2, a, b, c);
var compiled = lambda.Compile();
var slow = compiled(1, 2, 3);
Console.WriteLine($"Compiled result: {slow}");
// 在表达式树中嵌入 IL 代码
var mi = typeof(int).GetMethod("op_Addition", BindingFlags.Static | BindingFlags.Public);
var dynamicAdd = new DynamicMethod("", typeof(int), new[] { typeof(int), typeof(int) });
var il = dynamicAdd.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Call, mi);
il.Emit(OpCodes.Ret);
var fasterAdd = (Func)dynamicAdd.CreateDelegate(typeof(Func)));
var add3 = Expression.Call(Expression.Constant(fasterAdd), "Invoke", null, a, b);
var add4 = Expression.Call(Expression.Constant(fasterAdd), "Invoke", null, add3, c);
var lambdaWithIL = Expression.Lambda>(add4, a, b, c);
var compiledWithIL = lambdaWithIL.Compile();
var fast = compiledWithIL(1, 2, 3);
Console.WriteLine($"Compiled with IL result: {fast}");
}
}
输出:
Compiled result: 6
Compiled with IL result: 6