- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一段代码是从另一个站点复制的,用于解析 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 方法的参数是错误的方面,我们将不胜感激。
最佳答案
我试图用它做的是允许用户动态排序和过滤网格中的列。事实证明已经有一个优秀的库可以做到这一点,所以我下载了它并使用它代替了这段代码:
关于c# - Lambda 表达式不正确 - 需要返回一个 bool Func,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26351394/
我正在用 yacc/bison 编写一个简单的计算器。 表达式的语法看起来有点像这样: expr : NUM | expr '+' expr { $$ = $1 + $3; } | expr '-'
我开始学习 lambda 表达式,并在以下情况下遇到了以下语句: interface MyNumber { double getValue(); } MyNumber number; nu
这两个 Linq 查询有什么区别: var result = ResultLists().Where( c=> c.code == "abc").FirstOrDefault(); // vs. va
如果我们查看 draft C++ standard 5.1.2 Lambda 表达式 段 2 说(强调我的 future ): The evaluation of a lambda-expressio
我使用的是 Mule 4.2.2 运行时、studio 7.5.1 和 Oracle JDK 1.8.0_251。 我在 java 代码中使用 Lambda 表达式,该表达式由 java Invoke
我是 XPath 的新手。我有网页的html源 http://london.craigslist.co.uk/com/1233708939.html 现在我想从上面的页面中提取以下数据 完整日期 电子
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我将如何编写一个 Cron 表达式以在每天上午 8 点和下午 3:30 触发?我了解如何创建每天触发一次的表达式,而不是在多个设定时间触发。提前致谢 最佳答案 你应该只使用两行。 0 8 * * *
这个问题已经有答案了: What do 3 dots next to a parameter type mean in Java? (9 个回答) varargs and the '...' argu
我是 python 新手,在阅读 BeautifulSoup 教程时,我不明白这个表达式“[x for x in titles if x.findChildren()][:-1]”我不明白?你能解释一
(?:) 这是一个有效的 ruby 正则表达式,谁能告诉我它是什么意思? 谢谢 最佳答案 正如其他人所说,它被用作正则表达式的非捕获语法,但是,它也是正则表达式之外的有效 ruby 语法。 在
这个问题在这里已经有了答案: Why does ++[[]][+[]]+[+[]] return the string "10"? (10 个答案) 关闭 8 年前。 谁能帮我处理这个 JavaSc
这个问题在这里已经有了答案: What is the "-->" operator in C++? (29 个答案) Java: Prefix/postfix of increment/decrem
这个问题在这里已经有了答案: List comprehension vs. lambda + filter (16 个答案) 关闭 10 个月前。 我不确定我是否需要 lambda 或其他东西。但是,
C 中的 assert() 函数工作原理对我来说就像一片黑暗的森林。根据这里的答案https://stackoverflow.com/a/1571360 ,您可以使用以下构造将自定义消息输出到您的断言
在this页,John Barnes 写道: If the conditional expression is the argument of a type conversion then effec
我必须创建一个调度程序,它必须每周从第一天上午 9 点到第二天晚上 11 点 59 分运行 2 天(星期四和星期五)。为此,我需要提供一个 cron 表达式。 0-0 0-0 9-23 ? * THU
我正在尝试编写一个 Linq 表达式来检查派生类中的属性,但该列表由来自基类的成员组成。下面的示例代码。以“var list”开头的 Process 方法的第二行无法编译,但我不确定应该使用什么语法来
此 sed 表达式将输入字符串转换为两行输出字符串。两条输出行中的每一行都由输入的子串组成。第一行需要转换成大写: s:random_stuff\(choice1\|choice2\){\([^}]*
我正在使用 Quartz.Net 在我的应用程序中安排我的工作。我只是想知道是否可以为以下场景构建 CRON 表达式: Every second between 2:15AM and 5:20AM 最
我是一名优秀的程序员,十分优秀!