20

単純な親子クラス構造が与えられます。linqkit を使用して、親に子ラムダ式を適用したいと考えています。また、ユーティリティ メソッドによって Lambda 式が提供されるようにしたいと考えています。

public class Foo
{
    public Bar Bar { get; set; }
}

public class Bar
{
    public string Value { get; set; }
    public static Expression<Func<Bar, bool>> GetLambdaX()
    {
        return c => c.Value == "A";
    }
}
...

Expression<Func<Foo, bool>> lx = c => Bar.GetLambdaX().Invoke(c.Bar);
Console.WriteLine(lx.Expand());

上記のコードはスローします

System.InvalidCastException: Unable to cast object of type 
'System.Linq.Expressions.MethodCallExpression' to type 
'System.Linq.Expressions.LambdaExpression'.
at LinqKit.ExpressionExpander.VisitMethodCall(MethodCallExpression m)
at LinqKit.ExpressionVisitor.Visit(Expression exp)
at LinqKit.ExpressionVisitor.VisitLambda(LambdaExpression lambda)
at LinqKit.ExpressionVisitor.Visit(Expression exp)
at LinqKit.Extensions.Expand<TDelegate>(Expression`1 expr)
4

2 に答える 2

31
var lambdaX = Bar.GetLambdaX();

Expression<Func<Foo, bool>> lx = c => lambdaX.Invoke(c.Bar);

これは機能します。

書き込み注意

Expression<Func<Foo, bool>> lx = ...

割り当ての前に、コンパイラはこの行を処理し、あなたの場合、lx に割り当てられるメソッド呼び出し式 (つまり、Bar.GetLambdaX() を呼び出すため) を作成します。

var ... を使用する場合、Bar.GetLambdaX(); が呼び出されて割り当てられ、その値 (ラムダ式) が後で lx = ... で使用されます。

于 2010-04-21T21:25:29.837 に答える