【问题标题】:Import namespaces in a CodeSnippetCompileUnit在 CodeSnippetCompileUnit 中导入命名空间
【发布时间】:2012-07-18 15:14:20
【问题描述】:

当使用 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 允许您编译已作为字符串输入的类型定义。例如,字符串“public class 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 生成的文件中?

【问题讨论】:

    标签: c# .net codedom


    【解决方案1】:

    即使 CodeSnippetCompileUnit 派生自 CodeCompileUnit,编译器在从 CodeDOM 图生成代码时也会忽略 Namespaces 属性。从 CodeSnippetCompileUnit 生成的代码仅包含对象的 Value 属性中的字符串。

    如果您有上下文无关代码 sn-p,则导入命名空间或将 sn-p 包含在命名空间中的唯一选择是在设置 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 {}
    
    }
    

    【讨论】:

    • 您已经在使用逐字字符串,所以我认为实际的换行符会比您的 {2} 更好。
    • 你说得对。在这种情况下,它可能会提高代码示例的可读性。根据您的建议更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 2021-02-26
    • 2021-10-03
    • 2012-11-27
    • 2010-09-05
    • 2017-01-25
    相关资源
    最近更新 更多