动态数据-实现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'方法。
能告诉我从哪里开始吗?
您的方法调用不正确,要调用非静态方法您需要提供包含该方法的实例。下面是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);