В C #, что является хорошим способом исключить класс при выводе кода из текстового файла - PullRequest
0 голосов
/ 12 июля 2011

То, что я хочу сделать, может показаться странным сценарием.Пожалуйста, имейте в виду, что мне нужно сделать это для демонстрационного проекта, где я выводю код c # для пользователя, чтобы научить его, как кодируются определенные элементы управления.

Мне дан файл .cs, и мне нужно вывестисодержимое.В файле есть как минимум один класс, и самое большее ... много.Мне нужно вывести весь файл, за исключением одного типа класса.Конкретный тип класса, который я хочу предотвратить выводом, все наследуют определенный базовый класс, поэтому их должно быть легко различить.

Вот пример:

    public abstract class A{}

    public class B{]

    public class C{}

Предположим, что этобазовые типы, которые могут наследовать некоторые из моих классов.Я хочу запретить вывод всех классов, которые наследуются от 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: Выводдолжен быть точно таким же, как файл, который включает в себя все комментарии.

Другое редактирование: вместо ответа определенным программным обеспечением или библиотеками, которые могут это сделать, я бы больше предпочел алгоритмы.Может быть, регулярные выражения?Я не очень хорошо с ними отношусь, поэтому не знаю, для чего они могут быть использованы.

Ответы [ 3 ]

4 голосов
/ 12 июля 2011

Не могли бы вы обернуть все, что вам нужно исключить, с помощью:

#region ExcludeRegion
  [AttributeOne]
  [AttributeTwo]
  [AttributeThree]
  public class AA: A
  {
    //stuff
  }
#endregion

См. Документацию # региона

Это должно быть относительно легко для сканирования и исключения.Это также дает вам дополнительное преимущество, показывая, что вы прячете в IDE.

1 голос
/ 12 июля 2011

Вы можете попробовать использовать lib NRefactory с открытым исходным кодом .Он поддерживает синтаксический анализ кода в AST, который вы можете впоследствии изменить и сгенерировать выходной код.Он также может сохранить ваши комментарии, как показано на их вики-странице.

Нашел здесь: Альтернатива для "CSharpCodeProvider.Parse"

0 голосов
/ 12 июля 2011

Обновление: Очевидно, что нет реализации CodeDomProvider, которая поддерживает синтаксический анализ. Следовательно, это недействительно - я сохраню этот пост, чтобы убедиться, что он выделен тем, кто думает в том же духе.


Вы можете проанализировать код с помощью CodeDomProvider , а затем удалить необходимые классы и заново создать файл кода.

Если это для образовательных целей, это может не совсем соответствовать вашим потребностям, поскольку сгенерированный файл может не совсем совпадать с исходным файлом.

См. -

  1. Пространство имен System.CodeDom
  2. Использование CodeDOM
  3. Технология Microsoft .NET CodeDom - Часть 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...