如何使用codeDom在字段上隐藏完整的命名空间名称

时间:2015-10-07 14:15:05

标签: c# codedom

我尝试使用codeDom生成一些代码但无法找到删除字段和变量的完整命名空间的方法。

例如:

var field = new CodeMemberField
            {
                Attributes = MemberAttributes.Public | MemberAttributes.Final,
                Name = webElement.Name,
                Type = new CodeTypeReference(typeof(StringBuilder))
            };

将生成如下所示的字段:

public System.Text.StringBuilder myField 

当我想要它看起来像:

public StringBuilder myField 

即使我之前也将System.Text命名空间添加为CodeNamespaceImport。我试图查看CodeGeneratorOptions,但无法找到任何相关信息。

我看到的所有示例都没有完整的命名空间,所以我开始怀疑我是否做了不同的事情。这是一个完整的例子:

var targetUnit = new CodeCompileUnit();
var globalNamespace = new CodeNamespace();
globalNamespace.Imports.Add(new CodeNamespaceImport(typeof(StringBuilder).Namespace));

var targetNamespace = new CodeNamespace("MyNamespace");
var targetClass = new CodeTypeDeclaration("ClassName")
{
   IsClass = true,
   TypeAttributes = TypeAttributes.Public
};

var field = new CodeMemberField
            {
                Attributes = MemberAttributes.Public | MemberAttributes.Final,
                Name = "myField",
                Type = new CodeTypeReference(typeof(StringBuilder))
            };
targetClass.Members.Add(field);

targetNamespace.Types.Add(targetClass);
targetUnit.Namespaces.Add(globalNamespace);
targetUnit.Namespaces.Add(targetNamespace);

CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
var options = new CodeGeneratorOptions { BracingStyle = "C" };
var outputPath = Path.Combine(_outputPath, filename);
using (var sourceWriter = new StreamWriter(outputPath))
{
    provider.GenerateCodeFromCompileUnit(
                targetUnit, sourceWriter, options);
}

1 个答案:

答案 0 :(得分:1)

var field = new CodeMemberField
        {
            Attributes = MemberAttributes.Public | MemberAttributes.Final,
            Name = webElement.Name,
            Type = new CodeTypeReference("StringBuilder")
        };

这应该为您提供所需的输出。 但请注意,建议使用完全限定名称。

来自documentation

  

可以使用Type对象或字符串初始化Code​​TypeReference。通常建议使用Type来执行此操作,但可能并非总是可行。如果使用字符串初始化此类的实例,强烈建议始终使用完全限定类型,例如“System.Console”而不仅仅是“Console”,因为并非所有语言都支持导入名称空间。可以通过传入数组的类型对象或使用其中一个接受rank作为参数的构造函数来指定数组类型。

如果您知道并控制了生成代码的上下文,请随意使用带字符串的ctor。