Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 表达式等于_C# 4.0_Lambda - Fatal编程技术网

C# 4.0 表达式等于

C# 4.0 表达式等于,c#-4.0,lambda,C# 4.0,Lambda,所以,我试图找出表达式树。我试图添加一个动态等于一个查询表,其中T是几个不同表中的一个。我首先检查表是否包含要筛选的字段 ParameterExpression param = Expression.Parameter(typeof(TSource), "x"); Expression conversionExpression = Expression.Convert(Expression.Property(param, _sourceProperty), typeof(TList)); E

所以,我试图找出表达式树。我试图添加一个动态等于一个查询表,其中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);
ParameterExpression param=Expression.Parameter(typeof(TSource),“x”);
Expression conversionExpression=Expression.Convert(Expression.Property(param,_sourceProperty),typeof(TList));
Expression propertyExpression=Expression.Lambda(conversionExpression,param);
表达式方法表达式=(x,y)=>x.Equals(y);
ReadOnlyCollection参数=propertyExpression.parameters;
InvocationExpression getFieldPropertyExpression=Expression.Invoke(
propertyExpression,
parameters.Cast());
MethodCallExpression methodBody=methodExpression.Body作为MethodCallExpression;
MethodCallExpression methodCall=Expression.Call(methodBody.Method,Expression.Constant(equalTo),getFieldPropertyExpression);
Expression equalstatement=Expression.Lambda(方法调用,参数);
返回源.Where(equalstatement);
执行此操作时,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);
ParameterExpression sourceObject=Expression.Parameter(typeof(TSource),“x”);
表达式检查=表达式.Lambda
(
表达式。相等(
表达式.MakeMemberAccess(sourceObject,typeof(TSource).GetProperty(_sourceProperty)),
表达式.常数(equalTo)
),
源对象
);
返回来源。其中(检查);

有人能向我解释为什么原作不适合我所要做的吗?我想了解更多关于实际过程的信息,但我觉得我没有像我想的那样快速地了解它。

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

谢谢您的回答。我把这个标记为答案,因为它让我用我应该用的方式来看待这个问题。