2013-08-18 49 views
11

我有这个工作代码,将加载一个.cs文件到Roslyn SyntaxTree类中,创建一个新的PropertyDeclarationSyntax,将它插入到类,然后重新编写.cs文件。我正在做这个学习经历以及一些潜在的未来想法。我发现在任何地方都没有一个完整的Roslyn API文档,我不确定我是否有效地做到了这一点。我主要关心的是我在哪里调用'root.ToFullString()' - 虽然它的工作,这是做到这一点的正确方法?C#Roslyn API,读取一个.cs文件,更新一个类,写回.cs文件

using System.IO; 
using System.Linq; 
using Roslyn.Compilers; 
using Roslyn.Compilers.CSharp; 

class RoslynWrite 
{ 
    public RoslynWrite() 
    { 
     const string csFile = "MyClass.cs"; 

     // Parse .cs file using Roslyn SyntaxTree 
     var syntaxTree = SyntaxTree.ParseFile(csFile); 
     var root = syntaxTree.GetRoot(); 
     // Get the first class from the syntax tree 
     var myClass = root.DescendantNodes().OfType<ClassDeclarationSyntax>().First(); 

     // Create a new property : 'public bool MyProperty { get; set; }' 
     var myProperty = Syntax.PropertyDeclaration(Syntax.ParseTypeName("bool"), "MyProperty") 
          .WithModifiers(Syntax.Token(SyntaxKind.PublicKeyword)) 
          .WithAccessorList(
          Syntax.AccessorList(Syntax.List(
           Syntax.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration) 
            .WithSemicolonToken(Syntax.Token(SyntaxKind.SemicolonToken)), 
           Syntax.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration) 
            .WithSemicolonToken(Syntax.Token(SyntaxKind.SemicolonToken))))); 

     // Add the new property to the class 
     var updatedClass = myClass.AddMembers(myProperty); 
     // Update the SyntaxTree and normalize whitespace 
     var updatedRoot = root.ReplaceNode(myClass, updatedClass).NormalizeWhitespace(); 

     // Is this the way to write the syntax tree? ToFullString? 
     File.WriteAllText(csFile, updatedRoot.ToFullString()); 
    } 
} 
+1

为什么你关心'ToFullString()'? – svick

+0

我无法找到该类的任何文档,我不确定这是提取语法树的字符串表示形式并重新输出CS文件的最佳方式。我担心可能存在人为因素和其他不适合代码生成的情况。 – ShaunO

回答

3

回答的罗斯林CTP论坛in this post

这种方法一般是罚款,但如果你担心分配整个文件的文本字符串,你应该使用的iText。写(TextWriter)而不是ToFullString()。

请记住,有可能生成不会通过解析器进行往返的树。例如,如果您生成了违反优先规则的内容,那么SyntaxTree构造API将无法捕获该内容。

+0

感谢您的回答;我觉得必须有更多API特定的论坛! – ShaunO

相关问题