2012-07-18 159 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