Получение локальной переменной из lambaexpression

Моя проблема очень похожа на этот пост (получение объекта из выражения участника) отличается тем, что мне нужно получить его из поля.

// how to get 1 from i?
int i = 1;
Expression<Func<int, int, bool>> a = (x1, x2) => x1 == i;
BinaryExpression x = (BinaryExpression)a.Body;
x.Right.//What now?

Я не могу использовать get type.getmember.getvalue, как в связанном примере, потому что я — локальная переменная. Итак, как мне извлечь значение поля или локальной переменной (не обязательно локальной для того места, где я пытаюсь извлечь)?


person TheCatWhisperer    schedule 27.03.2015    source источник
comment
возможный дубликат force Expression‹› для оценки локальных переменных   -  person Grundy    schedule 27.03.2015


Ответы (2)


На самом деле вы можете сделать то же самое, что и в указанной ссылке, даже если i является «локальной переменной», потому что в вашем случае i больше не является локальной переменной. Напечатаем нашу лямбду:

Console.WriteLine((Expression<Func<int, int, bool>>) ((x1, x2) => x1 == i));

вывод будет примерно таким:

(x1, x2) => (x1 == значение (ConsoleApplication4.Program+‹>c__DisplayClass0).i)

То же самое можно увидеть, если декомпилировать код с замыканиями.

Так что код из ссылки будет работать нормально:

int i = 1;
Expression<Func<int, int, bool>> a = (x1, x2) => x1 == i;
BinaryExpression x = (BinaryExpression)a.Body;

var me = (MemberExpression) x.Right;
var ce = (ConstantExpression) me.Expression;
var fieldInfo = (FieldInfo)me.Member;
Console.WriteLine(fieldInfo.GetValue(ce.Value));
person ie.    schedule 27.03.2015

Можно скомпилировать и выполнить выражение:

var data = Expression.Lambda (x.Right).Compile ().DynamicInvoke ();
person cansik    schedule 27.03.2015