gpt4 book ai didi

c# - Lambda 表达式不正确 - 需要返回一个 bool Func

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

我有一段代码是从另一个站点复制的,用于解析 BindingSourceView 的过滤器表达式。原始代码是为 VS 2008 和更早的 .net 框架构建的,但是它不适用于 VS 2010 和 .Net 框架 V4,因为 Expression.Lambda 函数不再返回可以正确转换的函数。

<T> = Note

public class PostfixExpressionToLambda<T>
{
.
.
.

/// <summary>
/// This is the core function, it generates the Lambda.
/// </summary>
/// <param name="postfixExpression"></param>
/// <returns></returns>
private LambdaExpression GenerateExpressionFromPostfixList(IList<string> postfixExpression)
{
Stack<Expression> stack = new Stack<Expression>();
Dictionary<String, ParameterExpression> parameters = new Dictionary<String, ParameterExpression>();
List<ParameterExpression> parametersList = new List<ParameterExpression>();

parametersList.Add(inputObj);
Int32 i = 0;
while (i < postfixExpression.Count)
{
String token = postfixExpression[i];
//First of all check if is a name of a property of the object
if (propertyNames.Any(p => p.Name == token))
{
stack.Push(Expression.Property(inputObj, token));
}
else if (IsMemberAccessOperator(token))
{
//Member access operator could advance the index. This because the syntax used to invoke a method
//is not so good with postfix :) that because Name.Contains('xxx') becomes Name Contains . xxx because
//parenthesis are used to precedence.
ExecuteMemberAccessOperator(token, stack, postfixExpression, ref i);
}
else if (IsBinaryOperator(token))
{
ExecuteBinaryOperator(token, stack);
}
else if (IsUnaryOperator(token))
{
ExecuteUnaryOperator(token, stack);
}
else if (IsParameter(token))
{
ExecuteParameter(token, stack, parameters, parametersList);
}
else
{
stack.Push(Expression.Constant(token));
}
i++;
}

.
.
.

Expression final = stack.Pop();
if (stack.Count > 0) throw new ArgumentException("The postfix expression is malformed");
return Expression.Lambda(final, parametersList.ToArray());
}
.
.
.
}

上面显示的行返回一个字符串类型的 lambda 表达式,而不是 bool 类型。检查 lambda 值,返回的类型是:

.Lambda #Lambda1<System.Func`2[Armada.DataModels.Note,System.String]>Armada.DataModels.Note $object) {    "[CorrespondenceCategoryID]=6" }

它是从这个方法调用的:

public Expression<Func<T, P1, RetType>> Execute<P1, RetType>(IList<String> postfixExpression)
{
LambdaExpression lambda = GenerateExpressionFromPostfixList(postfixExpression);
return (Expression<Func<T, P1, RetType>>)lambda;
}

当表达式函数返回的值是字符串时,它会抛出一个异常,试图将返回的表达式转换为 bool 类型。 RetType= bool 值。异常(exception)情况是:

Unable to cast object of type 'System.Linq.Expressions.Expression`1[System.Func`2[Armada.DataModels.Note,System.String]]' to type 'System.Linq.Expressions.Expression`1[System.Func`2[Armada.DataModels.Note,System.Boolean]]'.

我认为解决此问题的简单方法是为 lambda 函数提供我想要返回的委托(delegate)(来自上一个代码块):

private LambdaExpression GenerateExpressionFromPostfixList<P1, RetType>(IList<string> postfixExpression)
{
.
.
.
return Expression.Lambda<Func<T, P1, RetType>>(final, parametersList.ToArray());
}

但是,在运行时,最后一行现在会抛出一个错误,表明

Incorrect number of parameters supplied for lambda declaration

被解析的字符串非常简单:“[CorrespondenceCategoryID]=6”

结果表达式应该针对列表中的每个对象进行评估,以确定哪些要包含在绑定(bind)源列表中。单个参数有一个 NodeType 参数和一个 Type of Note(我要过滤的对象。

在弄清楚如何修改原始代码以正确返回正确的类型,或弄清楚为什么传递给 Lambda 方法的参数是错误的方面,我们将不胜感激。

最佳答案

我试图用它做的是允许用户动态排序和过滤网格中的列。事实证明已经有一个优秀的库可以做到这一点,所以我下载了它并使用它代替了这段代码:

Dynamic Linq - Part 1

关于c# - Lambda 表达式不正确 - 需要返回一个 bool Func,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26351394/

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