【发布时间】:2019-08-13 09:25:09
【问题描述】:
我创建了一个将对象转换为表达式的方法。
private Expression<Func<TDto, bool>> GetObjectAsExpression<TSearchDto, TDto>(TSearchDto searchDto)
where TSearchDto : class where TDto : class
{
List<ParameterExpression> parameterExpressions = new List<ParameterExpression>();
Expression predicateBody = default(Expression);
int nodeCount = 1;
foreach (PropertyInfo property in searchDto.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
ParameterExpression parameterExpression =
Expression.Parameter(typeof(TDto), $"node{nodeCount++}");
parameterExpressions.Add(parameterExpression);
Expression left = Expression.Property(parameterExpression, property.Name);
Expression expression = Expression.Equal(left, Expression.Constant(property.GetValue(searchDto)));
if (predicateBody == null)
{
predicateBody = expression;
}
else
{
predicateBody = Expression.And(predicateBody, expression);
}
}
return Expression.Lambda<Func<TDto, bool>>(
predicateBody,
parameterExpressions
);
}
案例 1:当我使用单个属性调用此方法时,它工作正常。
GetObjectAsExpression<object, TDto>(new { CaseNumber = "00100283900813414832"})
案例 2:当我使用 2 个参数调用此方法时,它会引发错误
GetObjectAsExpression<object, TDto>(new { CaseNumber = "00100283900813414832", WareHouse = "008" })
有错误
System.ArgumentException: 'Incorrect number of parameters supplied for lambda declaration'
我还搜索了一个 nuget 包或可以完成此操作的源以及更多功能。请提出一个解决方案或一个现有的包来做这个等等。
【问题讨论】:
标签: c# .net lambda expression