2

何をしExpression<T>ますか?

次のような方法で使用されているのを見てきました。

private Expression<Func<MyClass,bool>> GetFilter(...)
{
}

そのまま返せないのFunc<MyClass,bool>

< 記号と > 記号が原因で、Google と SO の検索に失敗しました。

4

3 に答える 3

4

IfTDelegateがデリゲート型を表すExpression<TDelegate>場合、式ツリーとして型のデリゲートに変換できるラムダ式をTDelegate表します。これにより、ラムダ式をプログラムで検査して有用な情報を抽出できます。

たとえば、

var query = source.Where(x => x.Name == "Alan Turing");

thenx => x.Name == "Alan Turning"は、式ツリーとして表されている場合はプログラムで検査できますが、デリゲートと見なされている場合はそれほど検査できません。これは、式ツリーをたどってラムダ式を別の表現に変換する LINQ プロバイダーの場合に特に便利です。たとえば、LINQ to SQL は上記の式ツリーを次のように変換します。

 SELECT * FROM COMPUTERSCIENTIST WHERE NAME = 'Alan Turing'

それが可能なのは、ラムダ式がツリーとして表現されており、そのノードをウォークおよび検査できるためです。

于 2012-04-10T19:16:26.537 に答える
3

式を使用すると、デリゲート自体を格納するだけでなく、デリゲート内のコードの構造を調べることができます。

いつものように、MSDN はこの問題についてかなり明確です。

MSDN - 式 (TDelegate)

于 2012-04-10T19:15:27.863 に答える
0

はい、Func<>式の代わりに使用できます。式ツリーの有用性は、LINQ to SQLなどのリモートLINQプロバイダーに、クエリを機能させるために必要なステートメントを先読みして確認する機能を提供することです。言い換えれば、コードをデータとして扱うことです。

        //run the debugger and float over multBy2.  It will be able to tell you that it is an method, but it can't tell you what the implementation is.
        Func<int, int> multBy2 = x => 2 * x;
        //float over this and it will tell you what the implmentation is, the parameters, the method body and other data
        System.Linq.Expressions.Expression<Func<int, int>> expression = x => 2 * x;

上記のコードでは、デバッガーを介して利用できるデータを比較できます。私はあなたにこれをすることを勧めます。Funcには利用できる情報がほとんどないことがわかります。式を使用して再試行すると、実行時にメソッド本体やパラメーターなどの多くの情報が表示されます。これが式ツリーの真の力です。

于 2012-04-10T19:54:33.280 に答える