2013-02-16 19 views
5

У меня есть Func вроде этого:Как конвертировать Func <T,bool> в Expression <Func<T,bool>>

Func<MyClass, bool> func = x=>Id == 5; 

Как я могу преобразовать его в:

Expression<Func<MyClass, bool>> 
+1

Выражение представляет собой промежуточное представление функции лямбда. Func - это скомпилированная лямбда-функция. Не думайте, что вы можете конвертировать между ними. Зачем вам это нужно? – akhisp

ответ

3

Попробуйте это:

Func<MyClass, bool> func = x=>Id == 5; 
Expression<Func<MyClass, bool>> expr = mc => func(mc); 
+1

Это фактически устанавливает 'expr' для вызова делегата, который берет' MyClass' и возвращает 'bool'. 'expr' не будет содержать синтаксическое дерево для фактической лямбда. – Sean

+0

Да, это так. И что? Возможно, автор вопроса должен быть именно этим. – Memoizer

+1

Нельзя принять ответ. Метод не преобразуется в выражение вообще. –

2

Вы можете создать выражение, представляющее вызов созданного вами делегата. Но большую часть времени, когда вы используете Expression, вы делаете это, чтобы понять, что делает код (например, преобразовать его в SQL). И вы не можете сделать это с выражением для вызова непрозрачной функции.

9

Вы можете просто написать:

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.