.NET 4.0: несоответствие именования параметров между Expression и MethodInfo - PullRequest
0 голосов
/ 07 сентября 2010

Я только что обнаружил некоторое загадочное поведение при работе с 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);

    }

"a«?Куда ушел мой «x» и откуда взялся этот «a»?

Думая, что, возможно, это псевдоним, используемый на низком уровне, я искал «UsedName», «VisibleName» или что-то подобное.строк, но я ничего не нашел.

К сожалению, Expression не имеет свойства Parameters (я полагаю, что только LambdaExpression), которое возвращает "используемые параметры", если таковые имеются, в данном выражении.

Можно создать метод, который пересекает все выражение и собирает различные используемые параметры, но мне было интересно, есть ли более простой способ сделать это.

Заранее большое спасибо.

Visual C # Express: 10.0.30319.1 RTMRel

.NET Framework: 4.0.30319 RTMRel

Ответы [ 2 ]

2 голосов
/ 07 сентября 2010

a происходит от метода, который вы вызываете - Math.Sin.x и y - параметры вашего лямбда-выражения;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.

0 голосов
/ 07 сентября 2010

Поместите курсор на Sin в Visual Studio. Нажмите клавишу F12 . Вот откуда взято a. Он написан разработчиком из Редмонда, который решил назвать его так:

...