使用程序自动缩进格式化C#代码

9
我正在制作一个C#应用程序,其中包含一个 RichTextBox,用户可以在其中输入一些C#代码,并按照缩进格式进行排版,就像Visual Studio所做的那样。
private void btnEdit_Click(object sender, EventArgs e)
{
  //rchCode.Text= formattedCode; // Which I haven't got anywhere so far
}

我查找了同样的问题,这个答案建议使用一个叫做NArrange的东西,但我不想使用其他工具、插件或类似的东西。
此外,这个答案提供了CodeDOM的方法,但我还没有弄清楚如何使用它(如果它有任何帮助的话)。
我想通过编写一些实际的代码来完成它。我该怎么做?
3个回答

18

为了正确缩进代码,您需要 Microsoft.CodeAnalysis.CSharp nuget 包和 .NET framework 4.6+。示例代码:

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;

...

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文件中的方法进行排序,组织使用情况,创建区域等。


以下代码在C#文件中运行良好,但在cshtml文件中无法正常工作。是否有其他解决方案适用于HTML文件? - Karthic G

2

所以我这样得到了解决方案:

它仍然不完美(因为它总是在第一行代码之前添加一个或多个新行)。如果有人能够改进它或有更好的方法来完成它,我将感激任何新的建议。

private void btnEdit_Click(object sender, EventArgs e)
{
    RichTextBox rchTemp = new RichTextBox();
    foreach (string line in rchCode.Lines)
    {
        rchTemp.AppendText("\r\n" + line.Trim());
    }

    RichTextBox rchTemp2 = new RichTextBox();
    int indentCount = 0;
    bool shouldIndent = false;

    foreach (string line in rchTemp.Lines)
    {
        if (shouldIndent)
            indentCount++;

        if (line.Contains("}"))
            indentCount--;

        if (indentCount == 0)
        {
            rchTemp2.AppendText("\r\n" + line);
            shouldIndent = line.Contains("{");

            continue;
        }

        string blankSpace = string.Empty;
        for (int i = 0; i < indentCount; i++)
        {
            blankSpace += "    ";
        }

        rchTemp2.AppendText("\r\n" + blankSpace + line);
        shouldIndent = line.Contains("{");
    }
    rchCode.Text = rchTemp2.Text;
}

0
    public static string FormatCode(string code)
    {
        var lines = code.Split('\n').Select(s => s.Trim());

        var strBuilder = new StringBuilder();

        int indentCount = 0;
        bool shouldIndent = false;

        foreach (string line in lines)
        {
            if (shouldIndent)
                indentCount++;

            if (line.Trim() == "}")
                indentCount--;

            if (indentCount == 0)
            {
                strBuilder.AppendLine(line);
                shouldIndent = line.Contains("{");

                continue;
            }

            string blankSpace = string.Empty;
            for (int i = 0; i < indentCount; i++)
            {
                blankSpace += "    ";
            }

            if (line.Contains("}") && line.Trim() != "}")
                indentCount--;

            strBuilder.AppendLine(blankSpace + line);
            shouldIndent = line.Contains("{");
        }

        return strBuilder.ToString();
    }

顶部答案有所改进

如果行 public string Foo { get; set; } 格式正确。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接