2010-04-02 10 views
17

Basit bir ebeveyn/alt sınıf yapısı verildi. Ebeveyne bir çocuk lambda ifadesi uygulamak için linqkit kullanmak istiyorum. Lambda ifadesinin bir yardımcı program tarafından sağlanmasını istiyorum.LinqKit System.InvalidCastException Üye özellik üzerinde yöntemle sağlanan ifadeyi çağırırken

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()); 

Yukarıdaki kod

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) 
+0

Yardım edecektim ama kodunuzu derlemek için alamıyorum. Lx hattı çalışmıyor. – Nix

+0

Benim için derleme yaparsa, lx satırı örneğin bir – user293499

cevap

26
var lambdaX = Bar.GetLambdaX(); 

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

Bu işler atar.

atama Önce derleyici süreçlerini bu hat
Expression<Func<Foo, bool>> lx = ... 

yazma ile ve dava bir yöntem Çağrı Expression yaratır dikkatli olun (yani Bar.GetLambdaX çağırmak için()) lx atanmış olduğunu.

Eğer var ... kullanıyorsanız Bar.GetLambdaX(); çağrılır ve atanır, hangi değer (lambda ifadesidir) daha sonra kullanılır. lx = ...

+2

+ 1 kullanım yönteminde olmalıdır. İyi cevap! Derleyicinin lambda ifadeleri içindeki ifadeleri nasıl ele aldığına dair bağlamsal farklılıklar bazı çok beklenmeyen derleme hatalarına yol açabilir. –

+0

@DoctorJones Bu bir derleyici hatası değil. Bu sadece LINQKit'teki bir böcek. Gerektiğinde bu durumu desteklemiyor. Bu kodu desteklemek ve doğru bir şekilde çalışmak için yazılabilir (bu kodu işleyen aynı aracın kendi versiyonum var). – Servy

+0

Bir derleyici hatası (yani derleyici ile bir hata) olduğunu söylemedim, derleme hatası (derleme sırasında oluşan hata) olduğunu söyledim. Eğer LINQKit bunu desteklemiş olsaydı güzel olurdu, ayrıca LINQKit'in kendi kutudan daha fazla durumu ele alan kendi versiyonum var. –

İlgili konular