C#正确格式化(缩进、对齐)C#

C#正确格式化(缩进、对齐)C#,c#,code-generation,code-formatting,C#,Code Generation,Code Formatting,我们有一个代码生成器,它可以生成给定数据库的模式,从而自动化我们内部的n层体系结构。输出是各种C#分部类,每个文件一个 在咀嚼所有字符串的代码中,我们尽量控制缩进和格式,但在Visual Studio中打开文件时,格式总是错误的。一个快速的ctrl-k,ctrl-d修复了它,但是很明显,这种重新格式化在下次生成类时丢失了 我想知道的是,是否有一种方法可以像VisualStudio那样自动格式化文本文件的内容 伪码 Create "code" object, passing text file t

我们有一个代码生成器,它可以生成给定数据库的模式,从而自动化我们内部的n层体系结构。输出是各种C#分部类,每个文件一个

在咀嚼所有字符串的代码中,我们尽量控制缩进和格式,但在Visual Studio中打开文件时,格式总是错误的。一个快速的ctrl-k,ctrl-d修复了它,但是很明显,这种重新格式化在下次生成类时丢失了

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

伪码

Create "code" object, passing text file to constructor
Invoke "format" method
Re-save text file
非常感谢您的帮助

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

我似乎记得有一个名称空间,其中包含大量用于在C中创建C的类,但我不确定它是否包含任何有帮助的类

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

只有当您将代码生成器作为VS附加组件运行时,每个开发人员都将有不同的设置。

请看一看。您可能需要将这些东西作为构建的一部分进行自动化。
但不确定它是否满足您的所有要求。
引述:

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


下面介绍如何从宏或外接程序的上下文中执行此操作:

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程序集的引用。

您可以使用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代码提供程序


通过使用CodeSnippetExpression,您可能可以实现一些快捷方式。

要扩展Cherian的答案:

将允许您进行大量的代码格式化。它是开源的,并且源代码在他们的站点上可用,因此您可以潜在地将其与您的工具集成并重新发布


您应该只需要dll,只需查看exe,了解如何调用格式化。它还将创建正在格式化的代码的备份。如果它适合您的需要,它确实是一个不错的工具。

要以编程方式正确缩进代码,您需要Microsoft.CodeAnalysis.CSharp nuget软件包和.NET framework 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();

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

否,它是winforms应用程序。无论如何谢谢。谢谢你的回答,但这对我没有帮助,因为我想从我的代码中格式化代码。我喜欢NArrange。NArrange是从命令行调用的,所以你可以从代码中调用它。它不需要我在运行代码的机器上安装它吗?或者我的应用程序中是否有可再发行的dll?谢谢。源代码是可用的,所以您应该能够集成和重新发布。如果您这样做,请确保遵守许可证。是的,我不考虑这种生成代码的方式,因为它太冗长了。如果不重新编写代码生成器,我就无能为力。你知道System.CodeDom中是否有方法格式化类文件吗?CSharpCodeProvider有一个CreateParser()方法,但它只返回null,现在已过时。嗨,Randolpho-你是最接近的一个,但不幸的是,你的方法要求我在winforms应用程序旁边运行一个VS实例。你能想出一种方法在我的应用程序中创建VS实例吗(如果可能的话)?谢谢。回答得很好,8.5年后……)我问的代码生成器是.NET2.0,我似乎记得。我最近也遇到过同样的问题,用谷歌搜索了你的问题和其他几个问题。-根本没有最新的答案,所以我不得不写一个。我得到了一个错误“'SyntaxNode'不包含'NormalizeWhitespace'的定义,最好的扩展方法重载'SyntaxExtensions'。NormalizeWhitespace(SyntaxToken,string,string,bool)'需要一个'SyntaxToken'@KarthicG类型的接收器。我花了很长时间才解决这个问题,当我遇到同样的问题时,在我的类的顶部添加“using Microsoft.CodeAnalysis”使它消失了,它一定是一个扩展方法,可以与SyntaxNode一起工作。