【问题标题】:How To Prevent CodeMemberField From Inserting New Line?如何防止 CodeMemberField 插入新行?
【发布时间】:2015-04-09 17:19:15
【问题描述】:

我正在使用 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";
}

是否可以让生成不包含新行?

【问题讨论】:

  • 查看stackoverflow.com/questions/238002/… 以获取以编程方式删除字符串中的换行符的示例。
  • @calmond 我必须让 CodeDom 生成文件,然后读取文件,然后只删除我想要删除的换行符,然后将文件写回磁盘。不是很好用的东西......

标签: c# codedom


【解决方案1】:

发现 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);
    }
}

【讨论】:

    【解决方案2】:

    还有一个不错的用于 C# 代码生成的 nuget 包。也许它符合您的要求。这只是一个想法,因为在我看来,删除 codedom 对象的结果字符串中的空行是一种 hack。

    http://www.codeproject.com/Articles/892114/WuffProjects-CodeGeneration

    【讨论】:

    • 我使用的工具只接受与 CodeDom 一起工作的插件,所以你的建议不起作用。
    猜你喜欢
    • 1970-01-01
    • 2017-11-23
    • 2022-07-07
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多