1 回答

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個(gè)贊
您的代碼存在幾個(gè)問(wèn)題,但導(dǎo)致異常的主要問(wèn)題是StringContains
返回 lambda 表達(dá)式的方法。并且Expression.AndAlso
(以及大多數(shù)Expression
方法)基于簡(jiǎn)單的非 lambda 表達(dá)式(或 lambda 表達(dá)式主體)。解析代碼的整個(gè)想法是識(shí)別和組合簡(jiǎn)單的表達(dá)式,并從結(jié)果表達(dá)式中生成單個(gè) lambda 表達(dá)式。
要解決原始問(wèn)題,該StringContains
方法應(yīng)直接返回MethodCall
表達(dá)式而不是 lambda 表達(dá)式。
同一StringContains
方法中的第二個(gè)問(wèn)題是將參數(shù)反轉(zhuǎn)為string.Contains
. 它基本上是這樣做token.Contains(parameter)
的,而根據(jù)預(yù)期結(jié)果它應(yīng)該做相反的事情。
整個(gè)方法(使用另一個(gè)方便的Expression.Call
重載)可以簡(jiǎn)化為
static Expression StringContains(string subString) => Expression.Call(Param, "Contains", Type.EmptyTypes, Expression.Constant(subString));
現(xiàn)在一切都應(yīng)該按預(yù)期工作。
但是,由于ConditionParser
該類使用單個(gè)ParameterExpression
實(shí)例,然后用于構(gòu)建 lambda 表達(dá)式,因此不需要ParameterReplacer
,因此Lambda
方法(屬性)可以簡(jiǎn)化為
private static Parser<Expression<Func<string, bool>>> Lambda => AndTerm.End().Select(body => Expression.Lambda<Func<string, bool>>(body, Param));
- 1 回答
- 0 關(guān)注
- 115 瀏覽
添加回答
舉報(bào)