【问题标题】:C# to format (indent, align) C# properlyC# 正确格式化(缩进、对齐)C#
【发布时间】:2010-10-15 10:54:18
【问题描述】:

我们有一个代码生成器munges 给定数据库的架构,以自动化我们的内部 n 层架构。输出是各种 C# 部分类,每个文件一个。

在处理所有字符串的代码中,我们尝试尽可能多地保留缩进和格式设置,但是当您在 Visual Studio 中打开文件时,格式总是错误的。一个快速的 ctrl-k, ctrl-d 修复它,但显然这种重新格式化在下次生成类时丢失了。

我想知道的是,是否有一种方法可以像 Visual Studio 一样自动格式化文本文件的内容?

伪代码

Create "code" object, passing text file to constructor
Invoke "format" method
Re-save text file

非常感谢任何帮助。

编辑: 我应该澄清一下 - 我希望能够从我的 C# 代码中调用格式,该代码创建包含我生成的 C# 的文本文件。代码的格式可以标准化(不必是每个开发者),我不想安装任何第三方应用程序。

我似乎记得有一个命名空间包含大量用于在 C# 中创建 C# 的类:http://msdn.microsoft.com/en-us/library/system.codedom(VS.80).aspx,但我不确定它是否包含任何可以提供帮助的类。

进一步编辑: 我的代码生成器是一个通过单击安装部署的 winforms 应用程序。许多开发人员在内部使用它。我需要一个不需要每个开发人员都在他们的机器上安装工具的解决方案。

【问题讨论】:

    标签: c# code-generation code-formatting


    【解决方案1】:

    要以编程方式正确缩进代码,您需要 Microsoft.CodeAnalysis.CSharp nuget 包和 .NET 框架 4.6+。示例代码:

    public string ArrangeUsingRoslyn(string csCode) {
        var tree = CSharpSyntaxTree.ParseText(csCode);
        var root = tree.GetRoot().NormalizeWhitespace();
        var ret = root.ToFullString();
        return ret;
    }
    

    单线:

    csCode = CSharpSyntaxTree.ParseText(csCode).GetRoot().NormalizeWhitespace().ToFullString();
    

    您也可以使用NArrange 对cs 文件中的方法进行排序、组织使用、创建区域等。请注意,NArrange 不会缩进任何内容。

    【讨论】:

    • 不错的答案,8.5 年后.... :) 我问的代码生成器是 .NET 2.0,我似乎记得。
    • 我最近遇到了同样的问题,并用谷歌搜索了你的问题和其他几个问题。 - 根本没有最新的答案,所以我不得不写一个。
    • 我得到一个错误“'SyntaxNode'不包含'NormalizeWhitespace'的定义和最佳扩展方法重载'SyntaxExtensions.NormalizeWhitespace(SyntaxToken, string, string, bool)'需要一个接收器类型“语法令牌”
    • @KarthicG 我花了好几年才解决这个问题,因为我遇到了同样的问题 - 在我的班级顶部添加“使用 Microsoft.CodeAnalysis”让它消失了,它必须是一个扩展那里的方法与 SyntaxNode 一起使用。
    【解决方案2】:

    以下是如何从宏或加载项的上下文中执行此操作:

    var dte = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.8.0");
    dte.ExecuteCommand("File.OpenFile", filename);
    dte.ExecuteCommand("Edit.FormatDocument", filename);
    dte.ActiveDocument.Close(vsSaveChanges.vsSaveChangesYes);
    

    警告:正如@Greg Hurlman 所说,输出将根据用户当前的选项而有所不同。

    编辑:

    不幸的是,您的方法要求我在我的 winforms 应用程序旁边运行一个 VS 实例。你能想出一种在我的应用程序中创建 VS 实例的方法(如果可能的话)?

    我认为可以在您的 Win.Form 应用程序中执行此操作。但是,您必须在运行代码的机器上安装 Visual Studio。

    试试这个:

    var dte = (EnvDTE80.DTE2)Microsoft.VisualBasic.Interaction.CreateObject("VisualStudio.DTE.8.0", "");
    dte.ExecuteCommand("File.OpenFile", filename);
    dte.ExecuteCommand("Edit.FormatDocument", filename);
    dte.ActiveDocument.Close(vsSaveChanges.vsSaveChangesYes);
    

    请记住,您需要对 EnvDTE80.dll 程序集的引用。

    【讨论】:

    • 嗨 Randolpho - 你是最接近的人,但不幸的是,你的方法要求我有一个 VS 实例与我的 winforms 应用程序一起运行。您能想出一种从我的应用程序中创建 VS 实例的方法(如果可能的话)?谢谢。
    【解决方案3】:

    您可以使用 CodeDOM 和 CSharpCodeProvider。它都在命名空间 Microsoft.CSharp 和 System.CodeDom 中。

    她是一个属性的例子:

    StringWriter writer = new StringWriter();
    CSharpCodeProvider provider = new CSharpCodeProvider();
    CodeMemberProperty property = new CodeMemberProperty();
    property.Type = new CodeTypeReference(typeof(int));
    property.Name = "MeaningOfLifeUniverseAndEverything";
    property.GetStatements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(42)));
    provider.GenerateCodeFromMember(property, writer, null);
    Console.WriteLine(writer.GetStringBuilder().ToString());
    

    此代码将生成:

    private int MeaningOfLifeUniverseAndEverything {
        get {
            return 42;
        }
    }
    

    CodeDOM 是一种非常健谈的代码生成方式。好处是您可以生成多种语言。或许你可以找到一个 Erlang.NET CodeProvider?

    您也许可以使用 CodeSnippetExpression 做一些快捷方式。

    【讨论】:

    • 你好,Hallgrim。是的,我对这种生成代码的方式不屑一顾,因为它很冗长。如果不重新编写我们的代码生成器,我无能为力。不知道 System.CodeDom 中有没有格式化类文件的方法?
    • CSharpCodeProvider 有一个 CreateParser() 方法,但它只返回 null 并且现在已过时。
    【解决方案4】:

    看看Narrange。您可能需要在构建过程中自动执行这些操作。
    但不确定它是否满足您的所有要求。
    引用:

    NArrange 是一个 .NET 代码美化器 自动组织代码 .NET 中的成员和元素 类。

    【讨论】:

    • 感谢您的回答,但这对我没有帮助,因为我想从我的代码中格式化代码。
    • 我喜欢 NArrange。 NArrange是从命令行调用的,所以你可以从代码中调用它
    • 不需要我将它安装在我运行代码的机器上,还是我可以在我的应用程序中包含一个可再发行的 dll?谢谢。
    • 源可用,因此您应该能够集成和重新分发。如果这样做,请务必遵守许可
    【解决方案5】:

    仅当您将代码生成器作为 VS 插件运行时 - 每个开发人员将有不同的设置。

    【讨论】:

    • 不,它是一个 winforms 应用程序。还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-01-13
    • 2010-10-14
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多