gpt4 book ai didi

c# - 从对象构建表达式时为 lambda 声明提供的参数数量不正确

转载 作者:太空宇宙 更新时间:2023-11-03 11:59:59 25 4
gpt4 key购买 nike

我创建了一个将对象转换为表达式的方法。

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 包或可以完成此任务及更多功能的源代码。请建议一个解决方案或一个现有的包来执行此操作以及更多操作。

最佳答案

不确定您对整个 nodeCount 的意图是什么,但这就是问题所在。您正在生成的Func 永远只有一个 参数 - 一个单个 TDto 进入,一个 bool 出来了——所以你不应该将整个参数列表传递给你构建的谓词。

此外,为了简洁起见,如果您的谓词以 true 开头,则不需要空值检查 - 您只需链接 And 即可。

两者兼而有之:

private Expression<Func<TDto, bool>> GetObjectAsExpression<TSearchDto, TDto>(TSearchDto searchDto)
where TSearchDto : class where TDto : class
{
ParameterExpression singleParameterExpression = Expression.Parameter(typeof(TDto), "node");

Expression predicateBody = Expression.Constant(true);
foreach (PropertyInfo property in searchDto.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
Expression left = Expression.Property(singleParameterExpression, property.Name);
Expression expression = Expression.Equal(left, Expression.Constant(property.GetValue(searchDto)));
predicateBody = Expression.And(predicateBody, expression);
}

return Expression.Lambda<Func<TDto, bool>>(
predicateBody,
singleParameterExpression
);
}

我认为这会给出您想要的结果。

关于c# - 从对象构建表达式时为 lambda 声明提供的参数数量不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57474782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com