linqkit system.invalidcastexception عند استدعاء التعبير المقدم من الطريقة على خاصية الأعضاء

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

سؤال

بالنظر إلى هيكل فئة الوالد/الطفل البسيط. أريد استخدام LinqKit لتطبيق تعبير طفل Lambda على الوالد. أريد أيضًا أن يتم توفير تعبير 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)
هل كانت مفيدة؟

المحلول

var lambdaX = Bar.GetLambdaX();

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

هذا يعمل.

كن حذرا في الكتابة

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

قبل التخصيص ، يقوم برنامج التحويل البرمجي بمعالجة هذا السطر وفي حالتك ينشئ تعبيرًا عن الاتصال (أي للاتصال بـ bar.getlambdax ()) الذي تم تعيينه إلى LX.

إذا كنت تستخدم var ... ثم bar.getlambdax () ؛ يتم استدعاؤه وتعيينه ، يتم استخدام قيمة (وهو تعبير Lambda) لاحقًا في LX = ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top