Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从lambda表达式创建的操作中获取参数_C#_Lambda_Delegates - Fatal编程技术网

C# 从lambda表达式创建的操作中获取参数

C# 从lambda表达式创建的操作中获取参数,c#,lambda,delegates,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) { } } 你的意思是这样的: Action<int,int> act

当我只有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)
    {
    }
}

你的意思是这样的:

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

它可以被称为
act(1,2)

您的意思是这样的:

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

它可以被称为
act(1,2)

不能。为此,您需要MSDN中的
表达式),并且无法从
操作
转换为
表达式

无法。要做到这一点,您需要MSDN中的
表达式),并且您不能将
操作
转换为
表达式

这不能使用
操作
,但lambda表达式也可以被视为
表达式
,然后它就成为可能

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

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;
    }
}
公共类程序
{
公共静态void Main(字符串[]args)
{
var值=GetParams(()=>Test(1,2));
foreach(值中的var v)
System.Diagnostics.Debug.Print(v.ToString());
}
私有对象[]GetParams(表达式表达式表达式)
{
var body=(MethodCallExpression)expr.body;
var args=body.Arguments;
返回args.Select(p=>((ConstantExpression)p.Value).ToArray();
}
公共整数测试(整数arg1、整数arg2)
{
返回arg1+arg2;
}
}

不能使用
操作
,但lambda表达式也可以被视为
表达式
,然后它就成为可能

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

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;
    }
}
公共类程序
{
公共静态void Main(字符串[]args)
{
var值=GetParams(()=>Test(1,2));
foreach(值中的var v)
System.Diagnostics.Debug.Print(v.ToString());
}
私有对象[]GetParams(表达式表达式表达式)
{
var body=(MethodCallExpression)expr.body;
var args=body.Arguments;
返回args.Select(p=>((ConstantExpression)p.Value).ToArray();
}
公共整数测试(整数arg1、整数arg2)
{
返回arg1+arg2;
}
}

我想问题是:给定
act
,如何检索
1
2
?我想问题是:给定
act
,如何检索
1
2
?这是我最初的概念。我需要它来序列化这个动作。这是我最初的想法。我需要它来序列化这个动作。