我看过很多类似的帖子,似乎我声明的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',从范围''引用,但未定义。
答案 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 });
}