У меня есть Func вроде этого:Как конвертировать Func <T,bool> в Expression <Func<T,bool>>
Func<MyClass, bool> func = x=>Id == 5;
Как я могу преобразовать его в:
Expression<Func<MyClass, bool>>
У меня есть Func вроде этого:Как конвертировать Func <T,bool> в Expression <Func<T,bool>>
Func<MyClass, bool> func = x=>Id == 5;
Как я могу преобразовать его в:
Expression<Func<MyClass, bool>>
Попробуйте это:
Func<MyClass, bool> func = x=>Id == 5;
Expression<Func<MyClass, bool>> expr = mc => func(mc);
Это фактически устанавливает 'expr' для вызова делегата, который берет' MyClass' и возвращает 'bool'. 'expr' не будет содержать синтаксическое дерево для фактической лямбда. – Sean
Да, это так. И что? Возможно, автор вопроса должен быть именно этим. – Memoizer
Нельзя принять ответ. Метод не преобразуется в выражение вообще. –
Вы можете создать выражение, представляющее вызов созданного вами делегата. Но большую часть времени, когда вы используете Expression
, вы делаете это, чтобы понять, что делает код (например, преобразовать его в SQL). И вы не можете сделать это с выражением для вызова непрозрачной функции.
Вы можете просто написать:
Expression<Func<MyClass,bool>> expr = x=>Id == 5;
Это позволит установить expr
быть выражением дерево Id == 5
.
Если вы:
Func<MyClass, bool> func = x=>Id == 5;
Expression<Func<MyClass, bool>> expr = mc => func(mc);
Тогда это установит expr
быть выражением дерева для вызова func
, а не дерево выражения для тела func
.
Выражение представляет собой промежуточное представление функции лямбда. Func - это скомпилированная лямбда-функция. Не думайте, что вы можете конвертировать между ними. Зачем вам это нужно? – akhisp