在C#中,当从文本文件输出代码时,排除类的好方法是什么
我想做的可能看起来很奇怪。请记住,我需要在一个演示项目中这样做,在这个项目中,我向用户输出c#代码,教他们如何对某些控件进行编码 我得到了一个.cs文件,我需要输出内容。文件中至少有一个类,最多…很多。我需要输出整个文件,除了一种类型的类。我想要防止输出的特定类型的类都继承某个基类,因此它们应该很容易区分 以下是一个例子:在C#中,当从文本文件输出代码时,排除类的好方法是什么,c#,string,C#,String,我想做的可能看起来很奇怪。请记住,我需要在一个演示项目中这样做,在这个项目中,我向用户输出c#代码,教他们如何对某些控件进行编码 我得到了一个.cs文件,我需要输出内容。文件中至少有一个类,最多…很多。我需要输出整个文件,除了一种类型的类。我想要防止输出的特定类型的类都继承某个基类,因此它们应该很容易区分 以下是一个例子: public abstract class A{} public class B{] public class C{} 假设这些是我的一些类可能
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
见
这应该相对容易扫描和排除。它还为您提供了显示IDE中隐藏内容的额外好处。您是否可以用以下内容包装所有需要排除的内容:
#region ExcludeRegion
[AttributeOne]
[AttributeTwo]
[AttributeThree]
public class AA: A
{
//stuff
}
#endregion
见
这应该相对容易扫描和排除。它还为您提供了显示IDE中隐藏内容的额外好处。更新:显然没有支持解析的CodeDomainProvider实现。因此,这是无效的-我会保留这篇文章,以确保这是突出的人思考相同的行
您可以使用解析代码,然后删除所需的类并重新生成代码文件 如果是出于教育目的,这可能不完全符合您的需要,因为生成的文件可能与原始源文件不完全匹配 见-
更新:显然没有支持解析的CodeDomProvider实现。因此,这是无效的-我会保留这篇文章,以确保这是突出的人思考相同的行
您可以使用解析代码,然后删除所需的类并重新生成代码文件 如果是出于教育目的,这可能不完全符合您的需要,因为生成的文件可能与原始源文件不完全匹配 见-
您可以尝试使用开源lib。它支持将代码解析为AST,您可以在以后修改AST并生成输出代码。它还可以保留您的评论,如他们的wiki页面所示
在这里找到它:您可以尝试使用开源库。它支持将代码解析为AST,您可以在以后修改AST并生成输出代码。它还可以保留您的评论,如他们的wiki页面所示
在这里找到它:对代码文件的格式有任何保证吗?例如所有匹配的{和}大括号都在同一级别?例如,你能找到“public class”的缩进,然后跳到匹配的}吗,或者你能冒险拥有第一个代码示例中的类,即所有内容都在一行吗?编码指南有缩进的规范,但不能保证文件正确缩进(人们会变得懒惰)为什么需要从中输出第二个文件?你想解决什么问题?第二个文件是什么意思?我只需要将文件输出到屏幕,不包括一个类。好的,对不起,那你为什么要这样做?你不能用一个预定义的文件来代替它,这样你就可以确切地知道它里面有什么了吗?对代码文件的格式有任何保证吗?例如所有匹配的{和}大括号都在同一级别?例如,你能找到“public class”的缩进,然后跳到匹配的}吗,或者你能冒险拥有第一个代码示例中的类,即所有内容都在一行吗?编码指南有缩进的规范,但不能保证文件正确缩进(人们会变得懒惰)为什么需要从中输出第二个文件?你想解决什么问题?第二个文件是什么意思?我只需要将文件输出到屏幕,不包括一个类。好的,对不起,那你为什么要这样做?你不能改用一个预定义的文件,这样你就可以确切地知道里面有什么了吗?听起来OP对输入文件没有太多的控制权。人们可以随意向项目中添加更多的文件。这是一个内部助手产品,所有开发人员都可以访问。如果我不得不要求每个人都把它包起来,我想这会很不方便。我已经重新设计了这个项目,使它不那么依赖于为使它正常工作而必须做的事情。作为参考,我们已经在代码中使用了区域。如果这是唯一的解决方案,那么我可以试试。但这是一种折衷:更少的工作去发现该做什么