【问题标题】:How do I build Expression Call for Any Method with generic parameter如何使用泛型参数为任何方法构建表达式调用
【发布时间】:2016-01-12 05:09:03
【问题描述】:

我只是尝试使用 Linq.Expression 制作如下相同的表达式:

Expression<Func<Organization, bool>> expression = @org => 
    @org.OrganizationFields.Any(a =>
        a.CustomField.Name == field.Name &&
        values.Contains(a.Value));

在上面的示例中,我有一个名为 Organization 的实体,它有一个名为 OrganizationsFields 作为 IEnumerable 的属性,我想找到与 Any 参数表达式匹配的任何匹配项。

我只是使用下面的代码来动态生成表达式:

string[] values = filter.GetValuesOrDefault();

ParameterExpression parameter = Expression.Parameter(typeof(T), "org");
Expression organizationFields = Expression.Property(parameter, "OrganizationFields");

MethodInfo any = typeof(Enumerable)
   .GetMethods()
   .FirstOrDefault(a => a.Name == "Any" && a.GetParameters().Count() == 2)
   .MakeGenericMethod(typeof(OrganizationField));

Func<OrganizationField, bool> functionExpression = a =>
    a.CustomField.Name == filter.Name && values.Contains(a.Value);

Expression functionParam = Expression.Constant(
    functionExpression,
    typeof(Func<OrganizationField, bool>));

Expression call = Expression.Call(organizationFields, any, functionParam);

return Expression.Lambda<Func<T, bool>>(call, parameter);

当我调用方法 Expression.Call 时会出现问题,它会抛出 ArgumentExeption

谁能帮帮我?

问候

【问题讨论】:

  • 能否提供有关异常的详细信息,例如消息?
  • 还有,在这种情况下T是什么,你能显示方法签名吗?

标签: c# linq reflection expression


【解决方案1】:

给你

var org = Expression.Parameter(typeof(Organization), "org");
Expression<Func<OrganizationField, bool>> predicate = 
    a => a.CustomField.Name == filter.Name && values.Contains(a.Value);
var body = Expression.Call(typeof(Enumerable), "Any", new[] { typeof(OrganizationField) },
    Expression.PropertyOrField(org, "OrganizationFields"), predicate);
var lambda = Expression.Lambda<Func<Organization, bool>>(body, org);

基本部分(涵盖您的帖子标题)是以下有用的Expression.Calloverload

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

还要注意Anypredicate 参数必须作为Expression&lt;Func&lt;...&gt;&gt; 传递给Expression.Call

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多