gpt4 book ai didi

c# - Expression.Assign 将 Expression.Call 分配给 Expression.Variable

转载 作者:太空宇宙 更新时间:2023-11-03 20:11:23 26 4
gpt4 key购买 nike

我看过很多类似的帖子,似乎我声明的 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’,但它未定义。

最佳答案

正如其他人所说,您实际上并不需要中间变量,但鉴于您正在尝试了解表达式树,这是一个很好的信息。

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

关于c# - Expression.Assign 将 Expression.Call 分配给 Expression.Variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19828309/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com