1

我看过许多类似的帖子,似乎我声明的 var1 似乎需要在其他地方传递,但我似乎无法弄清楚。

public Expression<Func<ElementNode, bool>> CreateEqualNameExpression(string match)
{
    var parm = Expression.Parameter(typeof(ElementNode), "element");

    var expr = Expression.Call(parm, typeof(ElementNode).GetProperty("Name").GetGetMethod());
    var var1 = Expression.Variable(typeof(string), "elementName");
    var assign = Expression.Assign(var1, expr);

    var parm2 = Expression.Constant(match, typeof(string));

    var exp = Expression.Equal(assign, parm2);

    return Expression.Lambda<Func<ElementNode, bool>>(exp, new[] { parm });
}

基本上我正在尝试创建一个代表

(ElementNode ele) => ele.Name == match;

但我很难想出解决方案。任何帮助将不胜感激。

我收到错误:从范围引用的“System.STring”类型的“elementName”,但未定义。

4

3 回答 3

3

正如其他人所说,您实际上并不需要中间变量,但是当您尝试学习表达式树时,这是很好的信息。

局部变量必须在 a 中声明BlockExpression

public Expression<Func<ElementNode, bool>> CreateEqualNameExpression(string match)
{
    var parm = Expression.Parameter(typeof(ElementNode), "element");

    var expr = Expression.Property(parm, "Name");
    var var1 = Expression.Variable(typeof(string), "elementName");
    var assign = Expression.Assign(var1, expr);

    var parm2 = Expression.Constant(match, typeof(string));

    var exp = Expression.Equal(var1, parm2);

    return Expression.Lambda<Func<ElementNode, bool>>(
        Expression.Block(new[] { var1 }, assign, exp),
        parm);
}

这大约创建:

element => { var elementName = element.Name; return elementName == <constant>; }

请注意,我使用该Property方法来构建属性访问器,而不是使用Call. 这是访问属性的首选方式,除非该属性是非公开的。

于 2013-11-07T17:09:42.167 回答
2

你想要令人作呕的简单版本吗?

Expression.Lambda<Func<ElementNode, bool>> func = elem => elem.Name == match;

.Net 将为您构建表达式树。


顺便说一句,代码有错误,它应该将 var1 与匹配 (parm2) 进行比较,而不是“分配”

var exp = Expression.Equal(var1, parm2);
于 2013-11-07T05:18:19.197 回答
1

正如 svick 所说,不需要分配:

public Expression<Func<ElementNode, bool>> CreateEqualNameExpression(string match)
{
    var parmExpr = Expression.Parameter(typeof(ElementNode));

    var propertyExpr = Expression.Property(parmExpr, "Name");
    var constExpr = Expression.Constant(match, typeof(string));

    var isEqualExp = Expression.Equal(propertyExpr, constExpr);

    return Expression.Lambda<Func<ElementNode, bool>>(isEqualExp , new[] { parmExpr });
}
于 2013-11-07T17:20:36.990 回答