gpt4 book ai didi

linq - ExpressionVisitor.Visit 有什么作用?

转载 作者:行者123 更新时间:2023-12-04 15:37:40 27 4
gpt4 key购买 nike

在有人喊出答案之前,请通读问题。

.NET 4.0 的 ExpressionVisitor 方法的目的是什么:

public static ReadOnlyCollection<T> Visit<T>(ReadOnlyCollection<T> nodes, Func<T, T> elementVisitor)

我对这个方法的目的的第一个猜测是它会访问由 nodes 指定的每棵树中的每个节点。参数并使用 elementVisitor 的结果重写树功能。

情况似乎并非如此。实际上,这种方法似乎无济于事,除非我在这里遗漏了一些东西,我强烈怀疑我...

我尝试在我的代码中使用此方法,但当事情没有按预期进行时,我反射(reflection)了该方法并发现:
public static ReadOnlyCollection<T> Visit<T>(ReadOnlyCollection<T> nodes, Func<T, T> elementVisitor)
{
T[] list = null;
int index = 0;
int count = nodes.Count;
while (index < count)
{
T objA = elementVisitor(nodes[index]);
if (list != null)
{
list[index] = objA;
}
else if (!object.ReferenceEquals(objA, nodes[index]))
{
list = new T[count];
for (int i = 0; i < index; i++)
{
list[i] = nodes[i];
}
list[index] = objA;
}
index++;
}
if (list == null)
{
return nodes;
}
return new TrueReadOnlyCollection<T>(list);
}

那么有人会去哪里使用这种方法呢?我在这里缺少什么?

谢谢。

最佳答案

在我看来,它是一种将任意变换函数应用于表达式树并返回结果变换树或原始树(如果没有变化)的便捷方法。

我看不出这与标准表达式访问者的模式有何不同,除了使用访问者类型之外,它使用函数。

至于用法:

Expression<Func<int, int, int>> addLambdaExpression= (a, b) => a + b;

// Change add to subtract
Func<Expression, Expression> changeToSubtract = e =>
{
if (e is BinaryExpression)
{
return Expression.Subtract((e as BinaryExpression).Left,
(e as BinaryExpression).Right);
}
else
{
return e;
}
};

var nodes = new Expression[] { addLambdaExpression.Body }.ToList().AsReadOnly();
var subtractExpression = ExpressionVisitor.Visit(nodes, changeToSubtract);

您没有解释您期望它的行为方式以及为什么您认为它无所作为。

关于linq - ExpressionVisitor.Visit<T> 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3181212/

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