2012-12-31 24 views
2

我嘗試使用Roslyn獲取數組值。例如,如果我有一個C#代碼是這樣的:Roslyn:獲取數組值

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

然後我怎樣才能獲得該信息arrInt [0]是10,arrInt [1]爲20,依此類推。

回答

4

我鼓勵你到check the documentation,FAQ and samples,尤其是語法和語義分析部分。

這裏的解決方案:

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的快速監視窗口查看語法樹的層次結構。

如果您對代碼中的符號應用了某些語義分析,您可能可以獲得關於代碼中符號的更多有意義的信息。

+0

嗨Tenor,非常感謝您的答覆。它確實有幫助。歡呼聲 –

+0

不客氣:) – tenor

+0

您可能希望將'使用Roslyn.Compilers.CSharp;'添加到您的代碼中,以便每次使用該名稱空間中的類型時都不必重複說明。 – svick