2011-11-07 3 views
6

プロパティ、演算子、および一致する値をExpression<Func<T>,bool>から引き出す方法はありますか?次の例を考える:私はすでに式のプロパティ名を引き出すことができる何かを書いたExpression <Func <T, bool>>述語からどのようにプロパティ、演算子、および値を取得しますか?

Property: CustomerID 
Operator: Equals 
Value: 1 

Property: CustomerName 
Operator: Equals 
Value: Bob 

、しかし:

var customers = GetCustomers(); 
var customerQuery = customers.Where(x=> x.CustomerID == 1 
    && x.CustomerName == "Bob"); // The query is for illustration only 

私は次のようなものを得ることができるようにする必要があります私は値と演算子がどこに保持されているのか分かりませんが、ExpressionのDebugViewプロパティでははっきりとわかります。

答えて

8

オペレータはBinaryExpressionMethod、つまりEqualsノードになります。また、.NodeTypeの式を見てください。多くのことが明らかになります(Equal)。

は、典型的には、そのBinaryExpression.RightConstantExpressionになり、又は捕捉変数の場合:MemberExpressionになるよう捕捉コンテキストは、ConstantExpressionなりConstantExpression(メンバーがFieldInfoPropertyInfoのどちらであるかを調査し、その上に.GetValue(...)で値を取得する必要があります)。

+0

優秀、ありがとうございます。 '(BinaryExpression)predicate.Body'を使って'述語 'をキャストしなければなりませんでした。乾杯。 – GenericTypeTea

3

Marc Gravellsの回答に加えて(私はそこに+1)、ExpressionVisitorクラス(.Net 4の中身)を見てみる価値があると付け加えます.MSDNにはコピー/ペーストできる例があります3.5の場合)。特定の型の式を非常に簡単に抽出するコードを作成します。

あなたの場合は、VisitBinaryメソッドをオーバーライドすることになります。

私は通常、クラスを使用して、興味のある式を読み取り専用リストにプッシュします。たとえば、クラスの実装時に公開されます。あなたは式を書き換えるためにそれを使用していません。

+0

+1、ありがとう。確かにバイナリ表現を簡単に見つけることができますが、Marcの答えは、必要な情報を引き出す方法を示しているので、受け入れておきます。 – GenericTypeTea

+0

はい私は同意します - マークの答えはあなたにこの質問のナットとボルトを与え、ティックに値する。私は単に彼が提案しているものを達成するための簡単な方法を提供しています:) –

関連する問題