Prima che qualcuno gridi, rispondi alla domanda.Che cosa fa ExpressionVisitor.Visit <T> Do?
Qual è lo scopo del metodo in ExpressionVisitor NET 4.0 del:
public static ReadOnlyCollection<T> Visit<T>(ReadOnlyCollection<T> nodes, Func<T, T> elementVisitor)
La mia prima risposta in merito alla finalità di questo metodo è che sarebbe visitare ogni nodo in ogni albero specificato dal nodes
parametrizzare e riscrivere l'albero usando il risultato della funzione elementVisitor
.
Questo non sembra essere il caso. In realtà questo metodo sembra fare un po 'più di niente, a meno che manchi qualcosa qui, che sospetto fortemente di essere ...
Ho provato a usare questo metodo nel mio codice e quando le cose non hanno funzionato come previsto, ho riflettuto il metodo e ho trovato:
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);
}
Quindi, dove qualcuno dovrebbe effettivamente utilizzare questo metodo? Cosa mi manca qui?
Grazie.
Mi sarei aspettato che visitasse l'intero albero in addLambdaExpression, non solo addLambdaExpression. – Jeff
In tal caso, si desidera ereditare un tipo personalizzato da ExpressionVisitor e gestire il NodeType.Lambda nel metodo Visit(). – codekaizen