2016-09-30 50 views
1

我想使用roslyn在其上添加一个#define琐事来编辑C#文档。roslyn如何在C#文档顶部添加“#define VAR”

例如,让我们说我有以下

namespace MyNameSpace { 
<classes> 
} 

我想使它

#define X 
namespace MyNameSpace { 
<classes> 
} 

我试过如下:

DocumentEditor editor = <get document editor> 
var compilationUnit = SyntaxFactory.ParseCompilationUnit("#defin X"); 
       var defineXTrivia = compilationUnit.GetFirstDirective(); 
       editor.InsertBefore(editor.OriginalRoot, defineXTrivia); 
+2

去这里http://roslynquoter.azurewebsites.net/输入'#define VAR'并按下大按钮。这应该对你有所帮助。 – DavidG

+0

您尝试的代码是如何失败的? – svick

+0

当我CAL 升 editor.GetChangedDocument() 它抛出 InvalidOperationException异常:指定的项目不是一个列表的元素。 –

回答

2

我终于想通了:

// Create '#define X' trivia 
var defineXDirective = SyntaxFactory.Trivia(SyntaxFactory.DefineDirectiveTrivia("X", isActive : true).NormalizeWhitespace()); 

// Insert '#define X' trivia on top of the document 
var changedRoot = editor.OriginalRoot.WithLeadingTrivia(
        editor.OriginalRoot.GetLeadingTrivia().InsertRange(0, defineXDirective)); 
editor.ReplaceNode(editor.OriginalRoot, changedRoot); 
+1

尽管有效,但对于创建defineXDirective来说,这不是件容易的事吗? var defineXDirective = SyntaxFactory.Trivia(SyntaxFactory.DefineDirectiveTrivia(“X”,isActive:true).NormalizeWhitespace()); – Ties

+1

事实上,这是相当好的,我同意。 –