estoy experimentando con análisis de árboles de expresión y he escrito el siguiente código:C#: el parámetro String se restableció misteriosamente a vacío, ¡por favor ayuda!
private void TestExpressionTree()
{
Expression<Func<int, bool>> expression = x => x == 1 || x == 2;
string output = String.Empty;
HandleExpression(expression.Body, output);
Output("Output", output);
}
private void HandleExpression(Expression expression, string output)
{
switch (expression.NodeType)
{
case ExpressionType.Conditional:
HandleConditionalExpression(expression, output);
break;
case ExpressionType.OrElse:
HandleOrElseExpression(expression, output);
break;
case ExpressionType.Equal:
HandleEqualExpression(expression, output);
break;
case ExpressionType.Parameter:
HandleParameterExpression(expression, output);
break;
case ExpressionType.Constant:
HandleConstantExpression(expression, output);
break;
}
}
private void HandleConditionalExpression(Expression expression, string output)
{
ConditionalExpression conditionalExpression = (ConditionalExpression) expression;
HandleExpression(conditionalExpression.Test, output);
}
private void HandleOrElseExpression(Expression expression, string output)
{
BinaryExpression binaryExpression = (BinaryExpression)expression;
HandleExpression(binaryExpression.Left, output);
output += "||";
HandleExpression(binaryExpression.Right, output);
}
private void HandleEqualExpression(Expression expression, string output)
{
BinaryExpression binaryExpression = (BinaryExpression)expression;
HandleExpression(binaryExpression.Left, output);
output += "=";
HandleExpression(binaryExpression.Right, output);
}
private void HandleParameterExpression(Expression expression, string output)
{
ParameterExpression parameterExpression = (ParameterExpression)expression;
output += parameterExpression.Name;
}
private void HandleConstantExpression(Expression expression, string output)
{
ConstantExpression constantExpression = (ConstantExpression)expression;
output += constantExpression.Value.ToString();
}
La idea del código es para analizar el árbol de expresión y escribir información sobre los nodos en la cadena de salida variable. Sin embargo, cuando esta variable se escribe en la página (utilizando el método Output()
), me parece que está vacía.
Cuando utilizo el depurador para recorrer el código, me parece que la salida está ajustado para 'x' cuando se ejecuta el código HandleParameterExpression()
por primera vez, pero tan pronto como el control vuelve a HandleParameterExpression()
volver al bloque de interruptores en HandleExpression()
, la variable está misteriosamente vacía de nuevo.
Dado que las cadenas son tipos de referencia, simplemente debería ser capaz de pasar la referencia entre los métodos y los cambios en su valor realizado por los métodos deben conservarse, ¿verdad? ¿Hay alguna sutileza de paso de parámetros en C# de la que no estoy al tanto?
tigres Fácil! Cuatro respuestas en cinco minutos! Muchas gracias a todos! – David
¿Por qué no devuelve la salida modificada? ¿Me estoy perdiendo de algo? –
@Omar: porque no es necesario. Es posible usar métodos para modificar parámetros y simplemente devolver algo. – David