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

时间:2016-01-13 06:02:39

标签: c# formatting

我正在制作一个C#应用程序,其中包含一个RichTextBox,用户可以在其中放入一些C#代码,并按照Visual Studio的缩进格式进行格式化。< / p>

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

我查找了相同的问题,this answer建议使用名为NArrange的内容,但我不想使用其他工具,加载项等。

同样this one提供CodeDOM方式,我还没弄清楚如何使用它(如果它在任何方面都有帮助

我想通过编写一些实际代码来实现。有没有人以前做过或知道怎么做?

2 个答案:

答案 0 :(得分:5)

要正确缩进代码,您需要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();

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

答案 1 :(得分: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;
    }
}