как получить имена параметров из дерева выражений? - PullRequest
8 голосов
/ 29 января 2010

У меня есть выражение этого типа:

Expression<Action<T>> expression

как получить имена параметров из этого выражения (необязательно: и значения)?

пример:

o => o.Method("value1", 2, new Object());

имена могут быть str_par1, int_par2, obj_par3

Ответы [ 5 ]

17 голосов
/ 29 января 2010
Expression<Action<Thing>> exp = o => o.Method(1, 2, 3);
var methodInfo = ((MethodCallExpression)exp.Body).Method;
var names = methodInfo.GetParameters().Select(pi => pi.Name);
4 голосов
/ 29 января 2010

Имена параметров можно получить из свойства Parameters.

Например:

    Expression<Action<string, int>> expr = (a, b) => (a + b).ToString();
var names = expr.Parameters.Select(p => p.Name);  //Names contains "a" and "b"

Во второй части лямбда-выражения - это просто некомпилированные функции.
Их параметры не имеют значений, пока вы не скомпилируете выражение и не вызовете делегат с некоторыми значениями.

Если вы возьмете лямбда-выражение i => i.ToString(), где есть значения параметров?

3 голосов
/ 29 января 2010

Параметры для Method? Получите MethodInfo из выражения (в предположении, MethodCallExpression.Method), а затем используйте MethodBase.GetParameters() для получения параметров. (ParameterInfo обладает различными полезными свойствами, включая Name).

2 голосов
/ 29 января 2010

Мне действительно нужны имена параметров метода o => o.Method (par1, par2, par3)

У вас есть уверенность, что мы экстрасенс, возможно.

Во всяком случае, двигаться дальше.

Я на самом деле хотел имена параметров метода o => o.Method (par1, par2, par3)

Имя первого формального параметра:

(expression.Body as MethodCallExpression).Method.GetParameters()[0].Name

Выражение, которое является первым аргументом:

(expression.Body as MethodCallExpression).Arguments[0]

Для дальнейшего использования, документация здесь:

http://msdn.microsoft.com/en-us/library/system.linq.expressions.methodcallexpression.arguments.aspx

2 голосов
/ 29 января 2010

Как получить имена параметров из этого выражения?

expression.Parameters[0].Name

Для дальнейшего использования, документация здесь:

http://msdn.microsoft.com/en-us/library/bb359453.aspx

(необязательно: и значения)?

Это не имеет никакого смысла для меня. Можете ли вы объяснить, что вы подразумеваете под «и ценностями»?

...