何をしExpression<T>
ますか?
次のような方法で使用されているのを見てきました。
private Expression<Func<MyClass,bool>> GetFilter(...)
{
}
そのまま返せないのFunc<MyClass,bool>
?
< 記号と > 記号が原因で、Google と SO の検索に失敗しました。
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'
それが可能なのは、ラムダ式がツリーとして表現されており、そのノードをウォークおよび検査できるためです。
式を使用すると、デリゲート自体を格納するだけでなく、デリゲート内のコードの構造を調べることができます。
いつものように、MSDN はこの問題についてかなり明確です。
はい、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には利用できる情報がほとんどないことがわかります。式を使用して再試行すると、実行時にメソッド本体やパラメーターなどの多くの情報が表示されます。これが式ツリーの真の力です。