以编程方式设置带有缩进的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的方式,我还没有弄清楚如何使用它(如果它在任何情况下都有帮助)
我想通过编写一些实际的代码来实现这一点。我该怎么做?
要正确缩进代码,您需要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;}更正缩进。