rge*_*rcp 3 c# linq reflection expression
我只是尝试使用Linq.Expression创建如下表达式:
Expression<Func<Organization, bool>> expression = @org =>
@org.OrganizationFields.Any(a =>
a.CustomField.Name == field.Name &&
values.Contains(a.Value));
Run Code Online (Sandbox Code Playgroud)
在上面的这个例子中,我有一个名为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);
Run Code Online (Sandbox Code Playgroud)
当我调用方法Expression.Call它抛出一个ArgumentExeption时会出现问题
谁能帮我?
问候
干得好
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);
Run Code Online (Sandbox Code Playgroud)
必要部分(包括你的帖子标题)是以下有用的Expression.Call 重载
public static MethodCallExpression Call(
Type type,
string methodName,
Type[] typeArguments,
params Expression[] arguments
)
Run Code Online (Sandbox Code Playgroud)
还要注意,必须将predicate参数Any传递给Expression.Callas Expression<Func<...>>.
| 归档时间: |
|
| 查看次数: |
3763 次 |
| 最近记录: |