Expression.Assign将Expression.Call赋值给Expression.Variable

时间:2013-11-07 04:59:38

标签: c# expression-trees

我看过很多类似的帖子,似乎我声明的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;

但是我很难找到解决方案。任何帮助将不胜感激。

我收到错误:'rangeName'类型为'System.STring',从范围''引用,但未定义。

3 个答案:

答案 0 :(得分:2)

你想要这个令人作呕的简易版吗?

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

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


顺便说一句,代码有错,应该将var1与匹配(parm2)进行比较,而不是'assign'

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

答案 1 :(得分:2)

正如其他人所说的那样,你实际上并不需要中间变量,但是当你试图了解表达树时,看到它是很好的信息。

必须在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。这是访问属性的首选方式,除非该属性是非公开的。

答案 2 :(得分:1)

正如斯维克所说,没有必要进行任务:

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 });
}