私はPredicateBuilder
ジョセフ・アルバハリが書いた拡張メソッドを理解しており、これを見ましたがExpression.Invoke
、正直なところ、次のメソッドでその理由を理解できませんでした:
public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>>
expr1, Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke (expr2,
expr1.Parameters.Cast<Expression> ());
return Expression.Lambda<Func<T, bool>>
(Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);
}
彼はそれを少し説明しましたが:
興味深い作業は、And および Or メソッド内で行われます。最初の式のパラメーターを使用して 2 番目の式を呼び出すことから始めます。Invoke 式は、指定された式を引数として使用して、別のラムダ式を呼び出します。最初の式の本体と 2 番目の式の呼び出しバージョンから条件式を作成できます。最後のステップは、これを新しいラムダ式でラップすることです。
MSDNは次のように伝えています。
デリゲートまたはラムダ式を引数式のリストに適用する InvocationExpression を作成します。
これは私には少し理にかなっています。したがって、そのような式を使用する場合、基本的に引数を渡す必要はありません。
しかし、なぜかよく理解できませんでした。疲れたのか何かなのかな。
質問:
- いつ、どの状況で を使用するのが理にかなっていますか
InvocationExpression
。 Or<T>
メソッド (またはAndElse<T>
) メソッドがどのように機能するかを説明できる人はいますか?
アップデート:
InvocationExpression
仕事から家に帰るときのことを考えていたとき、次のように頭に浮かびました。
メソッドを呼び出すとき、簡単に言うCallMe(phoneNumber, time);
と、これはメソッド呼び出しと呼ばれます。そして、InvocationExpression
は を表す式である必要がありますCallMe(phoneNumber, time);
。LambdaExpression
などのラムダを表現するのと似ていt => t + 2
ます。したがって、基本的には、(パラメーターではなく) 引数に適用されるメソッド呼び出しです。そのため、呼び出しとして、パラメーターは必要なくなりましたが、引数が既にパラメーターに適用されているため、何かを返す可能性があります。
私が話しているコードの詳細については、http://www.albahari.com/nutshell/predicatebuilder.aspxをご覧ください。