如何防止 CodeMemberField 插入新行?
How To Prevent CodeMemberField From Inserting New Line?
我正在使用 CodeDom 生成结构
var type = new CodeTypeDeclaration();
type.Name = "MyStructure";
type.IsStruct = true;
type.TypeAttributes = TypeAttributes.Public;
type.Members.
type.Members.Add(new CodeMemberField{
Attributes = System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Const,
Name = "CreatedBy",
Type = new CodeTypeReference(typeof (String)),
InitExpression = new CodePrimitiveExpression("createdby"),
});
type.Members.Add(new CodeMemberField{
Attributes = System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Const,
Name = "ModifiedBy",
Type = new CodeTypeReference(typeof (String)),
InitExpression = new CodePrimitiveExpression("modifiedby")
});
生成时如下所示:
public struct MyStructure
{
public const string CreatedBy = "createdby";
public const string ModifiedBy = "modifiedby";
}
但我更希望它没有换行符:
public struct MyStructure
{
public const string CreatedBy = "createdby";
public const string ModifiedBy = "modifiedby";
}
是否可以让生成不包含新行?
发现 CodeGeneratorOptions 允许您指定 NoLineBreaksBetweenMembers。我不想将它应用于所有内容,但我可以只创建我的结构,然后将其添加为 CodeSnippetTypeMember:
type.Members.Insert(0, GenerateTypeWithoutEmptyLines(@struct));
...
/// <summary>
/// Removes the blank lines spaces by generating the code as a string without BlankLinesBetweenMembers
/// </summary>
/// <param name="type">The type.</param>
/// <returns></returns>
private static CodeSnippetTypeMember GenerateTypeWithoutEmptyLines(CodeTypeDeclaration type)
{
var provider = CodeDomProvider.CreateProvider("CSharp");
using (var sourceWriter = new StringWriter())
using (var tabbedWriter = new IndentedTextWriter(sourceWriter, "\t"))
{
tabbedWriter.Indent = 2;
provider.GenerateCodeFromType(type, tabbedWriter, new CodeGeneratorOptions()
{
BracingStyle = "C",
IndentString = "\t",
BlankLinesBetweenMembers = false
});
return new CodeSnippetTypeMember("\t\t" + sourceWriter);
}
}
还有一个用于 C# 代码生成的不错的 nuget 包。也许它符合您的要求。这只是一个想法,因为在我看来,删除 codedom 对象的结果字符串中的空 rowns 是一种 hack。
http://www.codeproject.com/Articles/892114/WuffProjects-CodeGeneration
我正在使用 CodeDom 生成结构
var type = new CodeTypeDeclaration();
type.Name = "MyStructure";
type.IsStruct = true;
type.TypeAttributes = TypeAttributes.Public;
type.Members.
type.Members.Add(new CodeMemberField{
Attributes = System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Const,
Name = "CreatedBy",
Type = new CodeTypeReference(typeof (String)),
InitExpression = new CodePrimitiveExpression("createdby"),
});
type.Members.Add(new CodeMemberField{
Attributes = System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Const,
Name = "ModifiedBy",
Type = new CodeTypeReference(typeof (String)),
InitExpression = new CodePrimitiveExpression("modifiedby")
});
生成时如下所示:
public struct MyStructure
{
public const string CreatedBy = "createdby";
public const string ModifiedBy = "modifiedby";
}
但我更希望它没有换行符:
public struct MyStructure
{
public const string CreatedBy = "createdby";
public const string ModifiedBy = "modifiedby";
}
是否可以让生成不包含新行?
发现 CodeGeneratorOptions 允许您指定 NoLineBreaksBetweenMembers。我不想将它应用于所有内容,但我可以只创建我的结构,然后将其添加为 CodeSnippetTypeMember:
type.Members.Insert(0, GenerateTypeWithoutEmptyLines(@struct));
...
/// <summary>
/// Removes the blank lines spaces by generating the code as a string without BlankLinesBetweenMembers
/// </summary>
/// <param name="type">The type.</param>
/// <returns></returns>
private static CodeSnippetTypeMember GenerateTypeWithoutEmptyLines(CodeTypeDeclaration type)
{
var provider = CodeDomProvider.CreateProvider("CSharp");
using (var sourceWriter = new StringWriter())
using (var tabbedWriter = new IndentedTextWriter(sourceWriter, "\t"))
{
tabbedWriter.Indent = 2;
provider.GenerateCodeFromType(type, tabbedWriter, new CodeGeneratorOptions()
{
BracingStyle = "C",
IndentString = "\t",
BlankLinesBetweenMembers = false
});
return new CodeSnippetTypeMember("\t\t" + sourceWriter);
}
}
还有一个用于 C# 代码生成的不错的 nuget 包。也许它符合您的要求。这只是一个想法,因为在我看来,删除 codedom 对象的结果字符串中的空 rowns 是一种 hack。
http://www.codeproject.com/Articles/892114/WuffProjects-CodeGeneration