c#-4.0 - 表达式等于

标签 c#-4.0 lambda

所以,我正在尝试找出表达式树。我试图添加动态等于可查询,其中 T 是几个不同的表之一。我首先检查表中是否包含我想要过滤的字段。

ParameterExpression param = Expression.Parameter(typeof(TSource), "x");

Expression conversionExpression = Expression.Convert(Expression.Property(param, _sourceProperty), typeof(TList));

Expression<Func<TSource, TList>> propertyExpression = Expression.Lambda<Func<TSource, TList>>(conversionExpression, param);

Expression<Func<TList, TList, bool>> methodExpression = (x, y) => x.Equals(y);

ReadOnlyCollection<ParameterExpression> parameters = propertyExpression.Parameters;

InvocationExpression getFieldPropertyExpression = Expression.Invoke(
                                                propertyExpression,
                                                parameters.Cast<Expression>());

MethodCallExpression methodBody = methodExpression.Body as MethodCallExpression;
MethodCallExpression methodCall = Expression.Call(methodBody.Method, Expression.Constant(equalTo), getFieldPropertyExpression);

Expression<Func<TSource, bool>> equalsStatement = Expression.Lambda<Func<TSource, bool>>(methodCall, parameters);

return source.Where(equalsStatement);

当我执行此命令时,我在 Call 语句中遇到了 MethodInfo 问题。它告诉我;

静态方法需要 null 实例,非静态方法需要非 null 实例。

我不是表达式树的大师,但我想我了解我在这里所做的大约 75%,并且知道我想要实现的目标。 TList 现在是一个不好的名字,但我从一个可以很好地生成 In 语句的示例中得到了这个名字。

我真的在这里寻找一个解释,以便我可以自己完成代码,或者一个解释我所缺少内容的解决方案。

编辑:

好吧,在经历了一个非常令人沮丧的下午之后,我仍然感觉自己不太明白自己在看什么,我想我已经有了答案。

ParameterExpression sourceObject = Expression.Parameter(typeof(TSource), "x");

Expression<Func<TSource, bool>> check = Expression.Lambda<Func<TSource, bool>>
        (
            Expression.Equal(
            Expression.MakeMemberAccess(sourceObject, typeof(TSource).GetProperty(_sourceProperty)),
            Expression.Constant(equalTo)
        ),
        sourceObject
);

return source.Where(check);

有人能够向我解释为什么原版不适合我想做的事情吗?我想更多地了解实际过程,但我觉得我没有像我希望的那样快地掌握它。

最佳答案

Expression.Call 有两组重载(每组都有很多重载)。一组用于实例方法,另一组用于静态方法。在静态方法中,第一个参数是 MethodInfo 对象 - 就像您所拥有的一样。对于实例方法,第一个参数应该是表示目标的表达式(即方法调用中“.”的左侧。)鉴于您收到的错误,听起来像MethodInfo 表示非静态方法,因此您必须提供一个表示实例的表达式作为第一个参数。

关于c#-4.0 - 表达式等于,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3695235/

相关文章:

inheritance - 从继承自 DynamicObject 的类继承

c# - 在给定的用户列表中分布

c# - Autofac 无法解析外部 Controller 上的属性

entity-framework - 涉及复杂对象的 Entity Framework 的 Linq 表达式构建

c# - C# 如何计算 lambda 表达式?

c# - 将异步与 Entity Framework 一起使用 IQueryable<T> 类型的选择列表

c#-4.0 - 如何获取字符串的宽度

c# - 如何将这些调用放在 SqlTransaction 中?

Java 可变参数传递 lambda 和值

java - Kotlin 中接口(interface)的 Lambda 实现