我需要从Linq.Expression中调用lambda。我知道我可以从lambda中获得一些方法信息,如下所示:
Func<double, double> square = x => x * x;
MethodInfo mInfo = square.Method;
但是MethodInfo需要System.RuntimeServices.Closure
第一个参数。由于我使用的是.NET Core,所以该类是System.Linq.Expressions
的内部类。即使该类的实例是使用反射创建的,我也不能从System.Linq.Expression.调用square
对此有什么变通办法吗?我正在写一个简单的公式计算器,但我需要lambdas来实现谓词逻辑、Newton-Raphson等思想。
更新:
此代码不起作用:
static void Main(string[] args) =>
Console.WriteLine(DoubleIt()(4));
static double CallAndDouble(Func<double, double> f, double x)
{
return f(x) + f(x);
}
static Func<double, double> DoubleIt()
{
var input = Expression.Parameter(typeof(double), "x");
var call = Expression.Call(typeof(Program).GetMethod(nameof(CallAndDouble)),
CreateLambda(), input);
return Expression.Lambda<Func<double, double>>(call, input).Compile();
}
static Expression CreateLambda()
{
var input = Expression.Parameter(typeof(double), "x");
var mult = Expression.Multiply(input, input);
return Expression.Lambda<Func<double, double>>(mult, input);
}
在实际的代码中,我会有一些以lambdas为参数的库函数(比如上面代码中的CallAndDouble
(。
@conton7解决。只是打字错误:我缺少BindingFlags。