首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Expression.Call分配给Expression.Variable的Expression.Assign

将Expression.Call分配给Expression.Variable的Expression.Assign
EN

Stack Overflow用户
提问于 2013-11-07 12:59:38
回答 3查看 574关注 0票数 1

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

代码语言:javascript
复制
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 });
}

基本上,我尝试创建一个方法来表示

代码语言:javascript
复制
(ElementNode ele) => ele.Name == match;

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

我收到错误:'System.STring‘类型的'elementName’从作用域‘’引用,但它没有定义。

EN

回答 3

Stack Overflow用户

发布于 2013-11-08 01:09:42

正如其他人所说,您实际上并不需要中间变量,但由于您正在尝试学习表达式树,因此了解它是很好的信息。

局部变量必须在BlockExpression中声明

代码语言:javascript
复制
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);
}

这大致创建了:

代码语言:javascript
复制
element => { var elementName = element.Name; return elementName == <constant>; }

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

票数 3
EN

Stack Overflow用户

发布于 2013-11-07 13:18:19

你想要简单得令人讨厌的版本吗?

代码语言:javascript
复制
Expression.Lambda<Func<ElementNode, bool>> func = elem => elem.Name == match;

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

顺便说一下,代码有一个错误,它应该将赋值与匹配(parm2)进行比较,而不是‘var1’

代码语言:javascript
复制
var exp = Expression.Equal(var1, parm2);
票数 2
EN

Stack Overflow用户

发布于 2013-11-08 01:20:37

正如svick所说,没有必要进行赋值:

代码语言:javascript
复制
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 });
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19828309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档