我尝试使用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);
}
答案 0 :(得分:1)
var field = new CodeMemberField
{
Attributes = MemberAttributes.Public | MemberAttributes.Final,
Name = webElement.Name,
Type = new CodeTypeReference("StringBuilder")
};
这应该为您提供所需的输出。 但请注意,建议使用完全限定名称。
可以使用Type对象或字符串初始化CodeTypeReference。通常建议使用Type来执行此操作,但可能并非总是可行。如果使用字符串初始化此类的实例,强烈建议始终使用完全限定类型,例如“System.Console”而不仅仅是“Console”,因为并非所有语言都支持导入名称空间。可以通过传入数组的类型对象或使用其中一个接受rank作为参数的构造函数来指定数组类型。
如果您知道并控制了生成代码的上下文,请随意使用带字符串的ctor。