Попробуйте скомпилировать выражение с помощью метода Compile
, затем вызовите возвращаемый делегат:
using System;
using System.Linq.Expressions;
class Example
{
static void Main()
{
Expression<Func<Boolean>> expression
= () => "MyValue".StartsWith("MyV");
Func<Boolean> func = expression.Compile();
Boolean result = func();
}
}
Как упомянул Эндрю, вы должны скомпилировать выражение, прежде чем сможете выполнить Это. Другой вариант - вообще не использовать Expression, что будет выглядеть следующим образом:
Func<Boolean> MyLambda = () => "MyValue".StartsWith("MyV");
var Result = MyLambda();
В этом примере лямбда-выражение компилируется при построении вашего проекта, а не преобразуется в дерево выражений. Если вы не управляете деревьями выражений динамически или не используете библиотеку, которая использует деревья выражений (Linq to Sql, Linq to Entities и т. Д.), Тогда имеет смысл сделать это таким образом.
То, как я это сделал, взято отсюда: Пример MSDN
delegate int del(int i);
static void Main(string[] args)
{
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
}
Также, если вы хотите использовать тип Expression
, тогда этот страница: Expression (TDelegate) Class (System.Linq.Expression) имеет следующий пример:
// Lambda expression as executable code.
Func<int, bool> deleg = i => i < 5;
// Invoke the delegate and display the output.
Console.WriteLine("deleg(4) = {0}", deleg(4));
// Lambda expression as data in the form of an expression tree.
System.Linq.Expressions.Expression<Func<int, bool>> expr = i => i < 5;
// Compile the expression tree into executable code.
Func<int, bool> deleg2 = expr.Compile();
// Invoke the method and print the output.
Console.WriteLine("deleg2(4) = {0}", deleg2(4));
/* This code produces the following output:
deleg(4) = True
deleg2(4) = True
*/