2012-07-18 53 views
2

使用CodeCompileUnit通過CodeDOM生成代碼時,可以通過創建與您定義類型的命名空間分開的CodeNamespace來導入命名空間。使用Imports屬性可以添加你想要的命名空間。如果將CodeNamespace添加到CodeCompile單元,則導入將顯示在由CodeDOM生成的文件的頂部。在CodeSnippetCompileUnit中導入命名空間

例如,使用CSharpCodeProvider編譯下面的CodeDOM圖:

CodeCompileUnit compileUnit = new CodeCompileUnit(); 
CodeNamespace importsNamespace = new CodeNamespace {Imports = {new CodeNamespaceImport("System"), new CodeNamespaceImport("System.Collections.Generic"), new CodeNamespaceImport("System.Linq")}}; 
CodeNamespace typeNamespace = new CodeNamespace("MyTypeNamespace"); 
compileUnit.Namespaces.Add(importsNamespace); 
compileUnit.Namespaces.Add(typeNamespace); 

會產生

//------------------------------------------------------------------------------ 
// <auto-generated> 
//  This code was generated by a tool. 
//  Runtime Version:4.0.30319.269 
// 
//  Changes to this file may cause incorrect behavior and will be lost if 
//  the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace MyTypeNamespace { 

} 

的CodeSnippetCompileUnit允許您編譯已進入作爲一個字符串類型定義。例如,字符串「public class TestClass {}」可以用作CodeSnippetCompileUnit的值。

const string testClassCodeString = "public class TestClass {}"; 
CodeSnippetCompileUnit snippetCompileUnit = new CodeSnippetCompileUnit {Value = testClassCodeString}; 
CodeNamespace importsNamespace = new CodeNamespace {Imports = {new CodeNamespaceImport("System"), new CodeNamespaceImport("System.Collections.Generic"), new CodeNamespaceImport("System.Linq")}}; 
CodeNamespace typeNamespace = new CodeNamespace("MyTypeNamespace"); 
compileUnit.Namespaces.Add(importsNamespace); 
compileUnit.Namespaces.Add(typeNamespace); 

將產生只包含一個文件:你怎麼能在命名空間中附上這類

public class TestClass {} 

,或者從生成的文件導入命名空間與CodeSnippetCompileUnit使用相同的代碼如上一個CodeSnippetCompileUnit?

回答

2

即使CodeSnippetCompileUnit派生自CodeCompileUnit,編譯器在從CodeDOM圖生成代碼時也會忽略Namespaces屬性。從CodeSnippetCompileUnit生成的代碼僅包含該對象的Value屬性中的字符串。

如果您有一個上下文無關的代碼段,唯一的選擇是導入命名空間或將該代碼段包含在名稱空間中,那麼在設置CodeSnippetCompileUnit的值之前先修改該字符串。

使用的問題上面的代碼作爲起點的一個例子:

string namespaceString = "MyTypeNamespace"; 
string codeString = "public class TestClass {}"; 
string snippetValue = string.Format(@" 
using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace {0} 
{{ 

{1} 

}}", namespaceString, codeString, Environment.NewLine); 

var snippetCompileUnit = new CodeSnippetCompileUnit {Value = snippetValue}; 

這將產生:

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace MyTypeNamespace 
{ 

public class TestClass {} 

} 
+0

您已經在使用逐字字符串,所以我認爲實際的新行會比你的{2}更好。 – svick 2012-07-19 01:06:27

+0

你是對的。在這種情況下,它可能會提高代碼示例的可讀性。根據您的建議更新。 – bozalina 2012-07-19 14:58:33