2013-09-30 95 views
2

我正在嘗試更新我的文件中的一個語句。我的要求是使用roslyn替換語句

protected override void OnLaunchApplication(LaunchActivatedEventArgs args) 
    { 
     NavigationService.Navigate("Hub", null); 
    } 

protected override void OnLaunchApplication(LaunchActivatedEventArgs args) 
    { 
     NavigationService.Navigate("Main", null); 
    } 

我使用下面的代碼來更新:

// read file contents 
      string fileContent = File.ReadAllText(targetFile); 

      // create syntax tree 
      SyntaxTree tree = SyntaxTree.ParseText(fileContent); 

      // locate OnLaunchApplication event 
      var targetMethod = 
       tree.GetRoot() 
        .DescendantNodes() 
        .OfType<MethodDeclarationSyntax>() 
        .FirstOrDefault(x => (string)x.Identifier.Value == "OnLaunchApplication"); 

      if (targetMethod != null) 
      { 
       StatementSyntax oldSyntax = targetMethod.DescendantNodes() 
        .OfType<StatementSyntax>() 
        .FirstOrDefault(x => x.ToString() == @"NavigationService.Navigate(""Hub"", null);"); 

       StatementSyntax newHubSyntax = Syntax.ParseStatement(@"NavigationService.Navigate(""Main"", null);"); 

       CompilationUnitSyntax newRoot = tree.GetRoot().ReplaceNode(oldSyntax, newHubSyntax); 

       File.WriteAllText(targetFile, newRoot.ToFullString()); 
      } 

但上述結果:

protected override void OnLaunchApplication(LaunchActivatedEventArgs args) 
    { 
NavigationService.Navigate("Main", null);  } 

聲明從左邊開始,甚至開始「}」brac ket出現在同一條線上。 有什麼建議嗎?

回答

3

您需要將舊語句中的SyntaxTrivia複製到新語句中。

順便說一句:最好對您想要替換的節點進行較弱的檢查,並且只替換「Hub」的LiteralExpressionSyntax。否則,原件中的任何空格都會讓您感到困惑,並且您將刪除要替換的語句中的任何其他格式/註釋/等。