我在使用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
答案 0 :(得分:2)
a
来自您正在调用的方法 - Math.Sin
。 x
和y
是lambda表达式的参数; a
是Math.Sin
中的参数。
如果您想返回x
和y
,请将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
来自的地方。它来自雷德蒙德的开发人员,他决定将其命名为: - )