以编程方式使用缩进格式设置C#代码

Ale*_*lig 2 c# formatting

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

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

我寻找了同样的问题,这个答案建议使用称为NArrange的东西,但我不想使用其他工具,加载项等。

同样,提供了CodeDOM方式,但我还没有弄清楚如何使用它(如果仍然有帮助的话

我想通过写一些实际的代码来做到这一点。有没有人做过或知道如何做?

Ant*_*lov 6

要正确缩进代码,您将需要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;
}
Run Code Online (Sandbox Code Playgroud)

单线:

csCode = CSharpSyntaxTree.ParseText(csCode).GetRoot().NormalizeWhitespace().ToFullString();
Run Code Online (Sandbox Code Playgroud)

您也可以使用NArrange在CS文件中对方法进行排序,组织使用,创建区域等。


Ale*_*lig 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;
}
Run Code Online (Sandbox Code Playgroud)