2009-12-06 13 views
7

実行時にラムダ式を作成して評価したいのですが、どうすればいいですか?私は、コレクションや他の値に対してではなく、それ自身で式を実行したい。式から結果を取得する

この段階では、それが作成されると、タイプがExpression<Func<bool>>であり、値が{() => "MyValue".StartsWith("MyV")}であることがわかります。

私はその時点でvar result = Expression.Invoke(expr, null);と呼ぶことができたと思いました。私はブール値の結果を得ました。しかし、それはちょうどInvocationExpressionを返します。デバッガでは{Invoke(() => "MyValue".StartsWith("MyV"))}のように見えます。

私は近くにいるとは思っていますが、結果を得る方法を理解できません!

ありがとうございました。

答えて

14

が返されるデリゲートを呼び出し、その後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(); 
    } 
} 
+0

感謝まさに私が欠けていたものです。そして明確に説明した:) – Marcus

+0

@Marcus - 喜んで助けて! –

+0

ちょっと構文の砂糖。最後の2行をただ1つの行に置き換えることができます。 ブール結果= expression.Compile()(); –

2

アンドリューが述べたように、あなたはそれを実行する前に、式をコンパイルする必要があります。他のオプションは次のようにDLOOK woulれ、まったく表現を使用しないことです。この例では

Func<Boolean> MyLambda =() => "MyValue".StartsWith("MyV"); 
var Result = MyLambda(); 

プロジェクトをビルドする場合、ラムダ式ではなく、式ツリーに変換されるので、コンパイルされます。式ツリーを動的に操作していない場合や、式ツリー(Linq to Sql、Linq to Entitiesなど)を使用するライブラリを使用している場合は、このようにするのが理にかなっています。

+0

この例では、私は動的に式ツリーを作成しているので、実行時にコンパイルする必要があります。しかし、ありがとう。 – Marcus

1

私はそれがちょうどここから持ち上げられるだろう方法:あなたは、このページをExpression<TDelegate>タイプを使用したい場合にもMSDN example

delegate int del(int i); 
static void Main(string[] args) 
{ 
    del myDelegate = x => x * x; 
    int j = myDelegate(5); //j = 25 
} 

を: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 
*/ 
関連する問題