2016-09-30 53 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

事實上,這是相當好的,我同意。 –