Я экспериментирую с синтаксическим анализом деревьев выражений и написал следующий код:
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();
}
Идея кода состоит в том, чтобы проанализировать дерево выражений и записать подробности об узлах в вывод строковой переменной. Однако, когда эта переменная записывается на страницу (с использованием метода Output()
), я обнаруживаю, что она пуста.
Когда я использую отладчик для пошагового выполнения кода, я нахожу, что вывод правильно установлен в 'x', когда код выполняет HandleParameterExpression()
в первый раз, но как только управление возвращается из HandleParameterExpression()
обратно в переключите блок в HandleExpression()
, переменная снова загадочно пуста.
Поскольку строки являются ссылочными типами, я должен просто иметь возможность передавать ссылку между методами, и изменения в его значении, сделанные методами, должны быть сохранены, верно? Есть ли какая-то тонкость передачи параметров в C #, о которой я не знаю?