从lambda表达式创建的动作中获取参数

时间:2016-12-30 13:13:43

标签: c# lambda delegates

当我只有Action委托时,如何获取参数1和2?

public class Program
{
    public static void Main(string[] args)
    {
        Action act = () => new Program().Test(1, 2);
    }

    public void Test(int arg1, int arg2)
    {
    }
}

3 个答案:

答案 0 :(得分:4)

不能。为此,您需要Expression<Action>(请参阅MSDN中的Expression),并且您无法从Action转换为Expression<Action>,只能从另一个方向转换。

Further reading

答案 1 :(得分:1)

你的意思是这样的:

Action<int,int> act = (a,b) => new Program().Test(a,b);

可以调用它而不是act(1,2);

答案 2 :(得分:0)

使用Action无法完成,但lambda表达式也可以视为Expression<Action>,然后就可以了。

请注意,下面的代码仅适用于此类表达式:它使用我们有方法调用的知识,并且我们使用常量作为参数。

public class Program
{
    public static void Main(string[] args)
    {
        var values = GetParams(() => Test(1, 2));
        foreach (var v in values)
            System.Diagnostics.Debug.Print(v.ToString());
    }

    private object[] GetParams<T>(Expression<Func<T>> expr)
    {
        var body = (MethodCallExpression)expr.Body;
        var args = body.Arguments;
        return args.Select(p => ((ConstantExpression)p).Value).ToArray();
    }

    public int Test(int arg1, int arg2)
    {
        return arg1 + arg2;
    }
}