首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在成员属性上调用方法提供的表达式时的LinqKit System.InvalidCastException

在成员属性上调用方法提供的表达式时的LinqKit System.InvalidCastException
EN

Stack Overflow用户
提问于 2010-04-02 12:13:05
回答 2查看 4.5K关注 0票数 20

给出一个简单的父类/子类结构。我想使用linqkit在父对象上应用子lambda表达式。我还希望Lambda表达式由实用程序方法提供。

代码语言:javascript
复制
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());

上面的代码抛出

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-22 05:25:30

代码语言:javascript
复制
var lambdaX = Bar.GetLambdaX();

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

这是可行的。

写作时要小心

代码语言:javascript
复制
Expression<Func<Foo, bool>> lx = ...

在赋值之前,编译器会处理这一行,在本例中会创建一个方法调用表达式(例如,用于调用Bar.GetLambdaX()),该表达式被赋值给lx。

如果您使用var ...然后调用并赋值Bar.GetLambdaX();,它的值(即lambda表达式)将在以后的lx = ...

票数 31
EN

Stack Overflow用户

发布于 2021-03-01 22:12:35

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2564975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档