2013-02-16 15 views
5

ich eine Func wie dieses:Wie Func konvertieren <T,bool> zu Expression <Func<T,bool>>

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

Wie ich es umwandeln kann: diese

Expression<Func<MyClass, bool>> 
+1

Ausdruck ist eine mittlere Darstellung einer Lambda-Funktion. Func ist die kompilierte Lambda-Funktion selbst. Glauben Sie nicht, dass Sie zwischen den beiden konvertieren können. Warum musst du das tun? – akhisp

Antwort

3

Versuchen:

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

Dies setzt 'expr' als Aufruf an einen Delegaten, der eine' MyClass' übernimmt und eine 'bool' zurückgibt. 'expr' enthält keinen Syntaxbaum für das tatsächliche Lambda. – Sean

+0

Ja, ist es. Na und? Vielleicht sollte der Autor der Frage genau das sein. – Memoizer

+1

Diese Antwort sollte nicht akzeptiert werden. Die Methode wird nicht in Ausdruck konvertiert. –

2

Sie können einen Ausdruck erstellen, der den Aufruf des von Ihnen erstellten Delegaten darstellt. Aber meistens, wenn Sie Expression s verwenden, tun Sie das, um zu verstehen, was der Code tut (z. B. um ihn in SQL zu konvertieren). Und Sie können das nicht mit einem Ausdruck tun, um eine undurchsichtige Funktion aufzurufen.

9

Sie können einfach schreiben:

Expression<Func<MyClass,bool>> expr = x=>Id == 5; 

Diese expr gesetzt wird Id == 5 ein Ausdruck Baum.

Wenn Sie das tun:

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

Dann ist diese expr gesetzt wird ein Ausdrucksbaum für einen Anruf zu func, kein Ausdruck Baum für den Körper von func zu sein.

Verwandte Themen