我有一系列对象都具有类似的属性,它们是所属组的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'。
关于从哪里开始的任何指示?
答案 0 :(得分:0)
您使用过的方法签名中的Type
:
public static MethodCallExpression Call(Type type,
string methodName,
Type[] typeArguments,
params Expression[] arguments);
指定包含特定静态方法的类型。
您需要此方法的类型实例可用 - 示例(与您的评论相关):
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);
答案 1 :(得分:0)
您的方法调用不正确,要调用非静态方法,您需要提供包含该方法的实例。以下是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);