LinqKit System.InvalidCastExceptionのメンバプロパティのメソッドが提供発現を呼び出す場合

StackOverflow https://stackoverflow.com/questions/2564975

質問

シンプルな親/子クラス構造を考えます。私は親に子ラムダ式を適用するためにlinqkitを使用したいです。私はまた、ラムダ式はユーティリティメソッドによって提供されたい。

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)
役に立ちましたか?

解決

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 = ...

に後で使用されます
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top