2

我尝试使用 Roslyn 获取数组值。例如,如果我有这样的 C# 代码:

int[] arrInt = {10, 20, 30, 40, 50};

那么如何获取 arrInt[0] 为 10、arrInt[1] 为 20 等信息。

4

1 回答 1

5

我鼓励您查看文档常见问题解答和示例,尤其是有关语法和语义分析的部分。

这是解决方案:

static void Main(string[] args)
{
    string code = "int[] arrInt = {10, 20, 30, 40, 50};";

    //Parse Syntax tree
    var tree = Roslyn.Compilers.CSharp.SyntaxTree.ParseText(code);

    //Locate the arrInt identifier in the Syntax tree
    var declarator = tree.GetRoot().DescendantNodesAndSelf().Where(t => t.Kind == Roslyn.Compilers.CSharp.SyntaxKind.VariableDeclarator
        && ((Roslyn.Compilers.CSharp.VariableDeclaratorSyntax)t).Identifier.ValueText == "arrInt").First() as Roslyn.Compilers.CSharp.VariableDeclaratorSyntax;

    var index = 1;
    var expression = GetExpressionAtInitializer(declarator, index);

    Console.WriteLine(expression);

    //Examine 'expression' for more information on value at the second index            
}

private static Roslyn.Compilers.CSharp.ExpressionSyntax GetExpressionAtInitializer(Roslyn.Compilers.CSharp.VariableDeclaratorSyntax declarator, int index)
{
    var initializerExpression = declarator.Initializer.Value as Roslyn.Compilers.CSharp.InitializerExpressionSyntax;
    var expression = initializerExpression.Expressions[index];
    return expression;
}

您可以使用 VS 的快速监视窗口来查看语法树的层次结构。

如果您对其进行一些语义分析,您可能能够获得有关代码中符号的更有意义的信息。

于 2013-01-01T03:48:10.293 回答