C # замыкания в выражениях LINQ - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь создать динамический запрос из выражений в соответствии с:

string pName = "Shaun";
List<Person> people = Person.Select(p => p.Name == pName );

Проблема возникает при оценке вышеприведенного выражения. Я не могу получить значение pName, потому что это закрытие. Я пробовал:

(ex as ConstantExpression).Value;

и

object result = new object();
(ex as ConstantExpression).Value.GetType().GetFields()[0].GetValue(result);

но я получаю "'Field 'pName' defined on type 'ConsoleApp1.Program+<>c__DisplayClass0_0' is not a field on the target object which is of type 'System.Object'.'" exception.

Кроме того,

object res = (ex as ConstantExpression).Value.GetType().GetFields()[0].GetRawConstantValue();

привело к 'Operation is not valid due to the current state of the object.' exception.

Как я могу прочитать значение из объекта замыкания?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Если ваш вопрос просто "дано выражение> (p => p.Name == pName), Как мне получить значение pName ", вот ответ:

static string GetExprValue<T>(Expression<Func<T, bool>> expr){

    var body = expr.Body as BinaryExpression;

    var right =  body.Right as ConstantExpression;

    return right.Value.ToString();
}

Конечно, это предполагает очень специфический формат выражения и кодаследует добавить, чтобы убедиться, что он действительно в правильном формате ...

0 голосов
/ 12 мая 2018

Я не смог найти конкретного ответа на вышеуказанный вопрос в интернете. Методом проб и ошибок я обнаружил, что исходный класс должен быть передан методу GetValue как:

object val = ((ConstantExpression)ex).Value;
object objectValue = val.GetType().GetFields()[0].GetValue(val);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...