如何使用codeDom在字段上隐藏完整的命名空间名称
本文关键字:命名空间 隐藏 codeDom 何使用 字段 | 更新日期: 2023-09-27 18:16:41
我试图用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);
}
var field = new CodeMemberField
{
Attributes = MemberAttributes.Public | MemberAttributes.Final,
Name = webElement.Name,
Type = new CodeTypeReference("StringBuilder")
};
这将为您提供所需的输出。但是,请注意,建议使用完全限定的名称。
来自文件:
CodeTypeReference可以用Type对象或字符串初始化。通常建议使用类型来执行此操作,尽管这可能并不总是可能的。如果使用字符串初始化此类的实例,强烈建议始终使用完全限定的类型,如"System.Console",而不仅仅是"Console",因为并非所有语言都支持导入命名空间。可以通过传入数组的类型对象或使用接受rank作为参数的构造函数之一来指定数组类型。
如果您知道并控制要为其生成代码的上下文,那么可以随意使用接受字符串的ctor。