在C#中,当从文本文件输出代码时,排除类的好方法是什么

在C#中,当从文本文件输出代码时,排除类的好方法是什么,c#,string,C#,String,我想做的可能看起来很奇怪。请记住,我需要在一个演示项目中这样做,在这个项目中,我向用户输出c#代码,教他们如何对某些控件进行编码 我得到了一个.cs文件,我需要输出内容。文件中至少有一个类,最多…很多。我需要输出整个文件,除了一种类型的类。我想要防止输出的特定类型的类都继承某个基类,因此它们应该很容易区分 以下是一个例子: public abstract class A{} public class B{] public class C{} 假设这些是我的一些类可能

我想做的可能看起来很奇怪。请记住,我需要在一个演示项目中这样做,在这个项目中,我向用户输出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


这应该相对容易扫描和排除。它还为您提供了显示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对输入文件没有太多的控制权。人们可以随意向项目中添加更多的文件。这是一个内部助手产品,所有开发人员都可以访问。如果我不得不要求每个人都把它包起来,我想这会很不方便。我已经重新设计了这个项目,使它不那么依赖于为使它正常工作而必须做的事情。作为参考,我们已经在代码中使用了区域。如果这是唯一的解决方案,那么我可以试试。但这是一种折衷:更少的工作去发现该做什么