gpt4 book ai didi

c# - 在 CodeSnippetCompileUnit 中导入命名空间

转载 作者:太空宇宙 更新时间:2023-11-03 11:19:17 24 4
gpt4 key购买 nike

当使用 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 生成的文件中?

最佳答案

即使 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 {}

}

关于c# - 在 CodeSnippetCompileUnit 中导入命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11544634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com