.NET 4.0:Expression和MethodInfo之间的参数命名不一致

时间:2010-09-06 20:51:19

标签: .net reflection lambda expression expression-trees

我在使用System.Linq.Expressions.Expression和System.Reflection.MethodInfo时发现了一些神秘的行为。

代码如下:

    static void Main(string[] args)
    {

        Expression<Func<double, double, double>> example = (x, y) => Math.Sin(x);

        //Prints out "x, y":
        Console.WriteLine(example.Parameters[0].Name + ", " + example.Parameters[1].Name);

        //Prints out "a":
        Console.WriteLine((example.Body as MethodCallExpression).Method.GetParameters()[0].Name);

    }

“一个”?我的“x”去了哪里,这个“a”来自哪里?

认为这可能是在低级别使用的别名,我搜索了“UsedName”,“VisibleName”或类似的东西,但我没有找到任何东西。

不幸的是,Expression没有Parameters属性(我相信只有LambdaExpression),它会返回给定表达式中的“使用中的参数”(如果有)。 / p>

可以创建一个遍历整个表达式并收集正在使用的不同参数的方法,但我想知道是否有更简单的方法来执行此操作。

提前多多感谢。

Visual C#Express:10.0.30319.1 RTMRel

.NET Framework:4.0.30319 RTMRel

2 个答案:

答案 0 :(得分:2)

a来自您正在调用的方法 - Math.Sinxy是lambda表达式的参数; aMath.Sin中的参数。

如果您想返回xy,请将example投放到LambdaExpression

foreach (ParameterExpression p in example.Parameters)
{
    Console.WriteLine(p.Name); // Prints x then y
}

所以不,这里没有矛盾。

编辑:如果你想找到方法调用中使用的参数 - 并且你确定 只是一个方法调用,而参数只是参数 - 你可以使用像:

var methodCall = (MethodCallExpression) example.Body;

// Implicitly casts each argument to ParameterExpression
foreach (ParameterExpression p in methodCall.Arguments)
{
    Console.WriteLine(p.Name);
}

在这种情况下,它只打印出x,因为它被用作Math.Sin的参数。

答案 1 :(得分:0)

将光标放在Visual Studio中的Sin上。按 F12 键。这是a来自的地方。它来自雷德蒙德的开发人员,他决定将其命名为: - )