以编程方式设置带有缩进的C#代码格式

本文关键字:代码 格式 缩进 编程 方式 设置 | 更新日期: 2023-09-27 18:30:09

我正在制作一个包含RichTextBox的C#应用程序,用户可以在其中放入一些C#代码,并像Visual Studio那样通过缩进对其进行格式化。

private void btnEdit_Click(object sender, EventArgs e)
{
  //rchCode.Text= formattedCode; // Which I haven't got anywhere so far
}

我找了同样的问题,这个答案建议使用NArrange,但我不想使用其他工具,插件之类的。

此外,这一个提供了CodeDOM的方式,我还没有弄清楚如何使用它(如果它在任何情况下都有帮助

我想通过编写一些实际的代码来实现这一点。我该怎么做?

以编程方式设置带有缩进的C#代码格式

要正确缩进代码,您需要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文件中的方法进行排序、组织usings、创建区域等。

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

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

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;
}
    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();
    }

对顶部的回答几乎没有改进

如果行公共字符串Foo{get;set;}更正缩进。