那么,你就需要钻到表达,发现MethodCallExpression
,然后看看它的参数。请注意,我们没有o
的值,所以我们必须假定该方法的参数不依赖于该参数。此外,我们仍然认为lambda表达式仅仅依赖于它是一个MethodCallExpression
?
编辑:好的,这里是一个编辑版本,它评估参数。然而,它假设你是而不是确实在参数中使用了lambda表达式参数(这是new object[1]
的意思 - 它有效地提供了一个空参数)。
using System;
using System.Linq.Expressions;
class Foo
{
public void Save(int x, string y, int z, double d)
{
}
}
class Program
{
static void Main()
{
var x = 1;
var a = 2;
var b = 3;
ShowValues<Foo>(o => o.Save(x, "Jimmy", a + b + 5, Math.Sqrt(81)));
}
static void ShowValues<T>(Expression<Action<T>> expression)
{
var call = expression.Body as MethodCallExpression;
if (call == null)
{
throw new ArgumentException("Not a method call");
}
foreach (Expression argument in call.Arguments)
{
LambdaExpression lambda = Expression.Lambda(argument,
expression.Parameters);
Delegate d = lambda.Compile();
object value = d.DynamicInvoke(new object[1]);
Console.WriteLine("Got value: {0}", value);
}
}
}
@Omu:但是你真的想要破解的代码 - 只在执行时 - 如果你使用了*任何其他形式的lambda表达式?如果你总是调用Save,为什么不直接传入参数呢? – 2010-09-22 06:13:59
@Jon Skeet,我打算用不同的参数调用很多其他方法,我不知道我只能用不变的值调用,我想我将不得不进一步调查这个 – Omu 2010-09-22 06:35:20
@Omu:这只是将代码倾倒在一个没有解释的问题中的问题。我说过*它很脆弱,一旦你开始使用任何其他模式就会失败...... – 2010-09-22 06:56:55