动态数据-实现List< intgt;包含()

本文关键字:包含 intgt 数据 实现 List 动态 | 更新日期: 2023-09-27 18:12:33

我有一系列对象,它们都有一个类似的属性,即它们所属组的id列表(每个孩子有许多父母)。

我在编程实现Linq表达式以使此过滤器正确工作时遇到了麻烦。

这是我目前为止写的:

IQueryable result = null;
   if (!string.IsNullOrWhiteSpace(this.ddlRouteNames.SelectedValue))
   {
      ConstantExpression ce = Expression.Constant(int.Parse(this.ddlRouteNames.SelectedValue));
      ParameterExpression pe = Expression.Parameter(source.ElementType);
      MemberExpression me = Expression.Property(pe, this.Column.Name);
      MethodCallExpression mce = Expression.Call(typeof(List<int>), "Contains", new[] { typeof(int) }, me, ce);
      result = source.Provider.CreateQuery(mce);
   }
return result;

我得到一个异常当尝试创建我的MethodCallExpression:

在类型'System.Collections.Generic.List ' 1[System.Int32]'上没有'Contains'方法。

能告诉我从哪里开始吗?

动态数据-实现List< intgt;包含()

您的方法调用不正确,要调用非静态方法您需要提供包含该方法的实例。下面是Contains方法调用的示例:

var list = new List<int> {1};
//Target for invoke method
var target = Expression.Constant(list);
var methodCallExpression = Expression.Call(target, typeof(List<int>).GetMethod("Contains"), Expression.Constant(1));

如果在你的代码me中,它是一个包含List的成员,代码将是这样的:

Expression.Call(me, typeof(List<int>).GetMethod("Contains"), ce);

您使用的方法签名中的Type:

public static MethodCallExpression Call(Type type, 
                                        string methodName, 
                                        Type[] typeArguments, 
                                        params Expression[] arguments);

指定包含特定static方法的类型。

您需要此方法的类型实例可用-一个示例(与您的注释相关):

var par = Expression.Parameter(typeof(int), "par");            
var inst = Expression.Parameter(typeof(List<int>), "inst");
var body = Expression.Call(inst, typeof(List<int>).GetMethod("Contains"), par);
var exp = Expression.Lambda(body, inst, par);
var deleg = exp.Compile();
var lst = new List<int>() { 1, 2, 3, 4, 5 };
var exists = deleg.DynamicInvoke(lst, 3);