当使用CodeCompileUnit通过CodeDOM生成代码时,可以通过创建与定义类型的名称空间分开的CodeNamespace来导入名称空间。使用Imports属性,可以添加所需的名称空间。如果将CodeNamespace添加到CodeCompile单元,则导入将显示在CodeDOM生成的文件的顶部。
例如,使用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允许您编译已作为字符串输入的类型定义。例如,字符串“公共类TestClass {}”可以用作CodeSnippetCompileUnit的值。对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是从CodeCompileUnit派生的,编译器在从CodeDOM图生成代码时也会忽略Namespaces属性。从CodeSnippetCompileUnit生成的代码仅包含对象的Value属性中的字符串。
如果您具有上下文无关的代码段,则导入命名空间或将代码段包含在命名空间中的唯一选择是在设置CodeSnippetCompileUnit的Value之前修改字符串。
以上述问题中的代码为起点的示例:
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 {}
}