【问题标题】:Format C# code with indents programmatically以编程方式使用缩进格式化 C# 代码
【发布时间】:2016-04-18 00:02:15
【问题描述】:

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

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 方式(如果它有帮助的话

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

【问题讨论】:

    标签: c# formatting


    【解决方案1】:

    要正确缩进代码,您需要 Microsoft.CodeAnalysis.CSharp nuget 包和 .NET 框架 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文件的解决方案
    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-11
      • 2010-11-23
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      • 2012-10-05
      相关资源
      最近更新 更多