在c#中,从文本文件输出代码时排除类的好方法是什么?
本文关键字:排除 方法 是什么 代码 文本 输出 文件 | 更新日期: 2023-09-27 18:01:51
我想做的事情可能看起来像一个奇怪的场景。请记住,我需要为一个演示项目这样做,在那里我输出c#代码给用户,教他们如何编码某些控件。
我得到一个。cs文件,我需要输出内容。文件中至少有一个类,最多…很多。我需要输出整个文件,除了一种类型的类。我想要防止输出的特定类型的类都继承了某个基类,因此它们应该很容易区分。
下面是一个例子:
public abstract class A{}
public class B{]
public class C{}
假设这些是我的一些类可能继承的基本类型。我想防止输出从A继承的所有类。A可能将是唯一的抽象基类,所以如果这可以帮助无论如何,那将是很棒的。
假设我有一个文件,example。cs:
using System;
using OtherStuff;
namespace blah.blahagain.someotherblah
{
[AttributeOne]
[AttributeTwo]
[AttributeThree]
public class AA: A
{
//stuff
}
public class BB: B
{
//stuff
}
public class CC: C
{
//stuff
}
public class D
{
//stuff
}
}
输出应为
using System;
using OtherStuff;
namespace blah.blahagain.someotherblah
{
public class BB: B
{
//stuff
}
public class CC: C
{
//stuff
}
public class D
{
//stuff
}
}
我想到的唯一方法是暴力字符串操作。但是,我不能使用空白作为类之间的分隔符,因为不能保证类之间甚至会有空白。我需要跟踪开、闭大括号来发现一个类的开始和另一个类的结束。我还需要通过测试第一个{}对之前的字符串标记来测试每个类的基类。
我还需要防止输出AA的属性。
既然有很多聪明的人,我在这里问是否有另一种更简单/更干净的方法来做我需要的事情。
感谢阅读!
在YetAnotherUser的回答之后编辑:输出应该与文件完全相同,其中包括所有注释。
另一个编辑:与其用某些软件或库来回答这个问题,我更喜欢算法。也许是正则表达式?我不太擅长使用它们,所以我不知道它们的使用范围。
你能不能用:
#region ExcludeRegion
[AttributeOne]
[AttributeTwo]
[AttributeThree]
public class AA: A
{
//stuff
}
#endregion
请参阅#region文档
这应该相对容易扫描和排除。它还为您提供了显示隐藏在IDE中的内容的额外好处。
您可以尝试使用开源库NRefactory。它支持将代码解析为AST,然后可以修改AST并生成输出代码。它也可以保留你的评论,显示在他们的wiki页面上。
在这里找到:"CSharpCodeProvider.Parse"
Update:显然CodeDomProvider没有支持解析的实现。因此,这是无效的-我将继续这篇文章,以确保这是突出显示给有人思考相同的行。
您可以使用CodeDomProvider解析代码,然后删除所需的类并重新生成代码文件。
如果是用于教学目的,这可能不完全符合您的需要,因为生成的文件可能与原始源文件不完全匹配。
参见-
- 系统。li>使用CodeDOM
- Microsoft .NET CodeDom技术-第1部分