在有人喊出答案之前,请先阅读问题。
.NET 4.0的ExpressionVisitor中该方法的用途是什么:
public static ReadOnlyCollection<T> Visit<T>(ReadOnlyCollection<T> nodes, Func<T, T> elementVisitor)
我首先想到的是这个方法的目的是访问nodes
参数指定的每个树中的每个节点,并使用elementVisitor
函数的结果重写树。
情况似乎并非如此。实际上这种方法似乎比什么都没有,除非我在这里遗漏了一些东西,我强烈怀疑我是...
我尝试在我的代码中使用此方法,当事情没有按预期运行时,我反映了该方法并发现:
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);
}
那么有人会在哪里使用这种方法呢?我在这里缺少什么?
感谢。
答案 0 :(得分:3)
在我看来,它是一种方便的方法,可以将一个任意变换函数应用于表达式树,并返回生成的变换树,如果没有变化则返回原始树。
我看不出这是一个标准表达式访问者的模式有何不同,除了使用访问者类型之外,它使用了一个函数。
至于用法:
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);
你没有解释你对它的预期表现如何,以及为什么你认为它只能做什么。