Получить содержимое метода из файла CS - PullRequest
4 голосов
/ 04 ноября 2008

У меня есть требование получить содержимое каждого метода в файле cs в строку. Что я ищу, так это когда у вас есть ввод файла cs, возвращается словарь с именем метода в качестве ключа и тела метода в качестве значения.

Я пробовал Regex и рефлексию безуспешно, кто-нибудь может помочь?

Спасибо

Ответы [ 6 ]

5 голосов
/ 04 ноября 2008

Не знаю, полезно ли вам это, но в надстройках Visual Studio есть объект EnvDTE, который дает вам полный доступ к анализаторам языка VB и C #. См. Обнаружение кода с кодом Модель

Я коснулся этой темы несколько лет назад, я не знаю, насколько сложно ее использовать или насколько она эффективна, но похоже, что она даст вам то, что вам нужно.

Модель кода позволяет автоматизация клиентов, чтобы избежать реализация парсера для Visual Студия языков для того, чтобы открыть определения высокого уровня в проект, такой как классы, интерфейсы, структуры, методы, свойства и и так далее.

Если вы прочитаете статью полностью, она расскажет, как извлечь полный текст из файла для функции

Надеюсь, это поможет:)

2 голосов
/ 04 ноября 2008

Предполагая, что файл действителен (т.е. компилируется), вы можете начать с чтения всего файла в строку.

Я понял из вашего вопроса, что вас интересуют только имена методов, а не имена классов. Затем вам нужно регулярное выражение, которое дает вам все экземпляры public | protected | private , дополнительные ключевые слова virtual / override и т. Д., MethodName , (, дополнительные параметры, ) . Было бы полезно, если бы существовали соглашения о кодировании, поэтому вы могли бы предположить , что все определения методов всегда были в одной строке, а не разбиты на несколько строк.

Если у вас есть это, нужно лишь посчитать {и}, чтобы получить тело функции.

И последний совет: Остерегайтесь предположений . У них отвратительная привычка кусать тебя в зад.

РЕДАКТИРОВАТЬ: Ой, забыл о комментариях! если в теле метода есть скобки в комментариях, ваш подсчет может пойти не так. Так что вам нужно убрать все комментарии из источника в качестве самого первого шага.

1 голос
/ 04 ноября 2008

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

Согласно StingyJack, простой способ сделать это - создать регулярное выражение, которое идентифицирует только определения функций. Тогда вы можете предположить, что все промежуточное является функциональным телом. Однако это предположение не будет обрабатывать такие вещи, как множественные классы в одном файле или даже конечные} в конце класса. Чтобы справиться с подобными вещами, вам придется создать компилятор c #, поскольку обработка полной грамматики c # - единственное, что будет правильно определять, что c # считает функцией.

0 голосов
/ 04 ноября 2008

NRefactory - инструмент для этой работы. Посмотрите здесь: http://laputa.sharpdevelop.net/content/binary/NRefactory.wmv

0 голосов
/ 04 ноября 2008

Лучшим вариантом будет нестандартный парсер. Как заявил Блэр в комментарии к StingyJack, ОЧЕНЬ сложно разобрать код с помощью регулярного выражения. Я пытался сделать это один раз, и, хотя балансировочные скобки можно сопоставить с NET, экранировать комментарии и строки намного сложнее.

С парсером все должно быть намного проще. Смотрите antlr для хорошего генератора.

Что касается рефлексии, я думаю, вы могли бы попытаться скомпилировать код (если у вас есть все необходимые зависимости) и затем получить доступ к его содержимому, похожему на рефлекторный. Но я бы пошел с парсером.

0 голосов
/ 04 ноября 2008

после того, как вы найдете заголовки функций, считайте количество фигурных скобок, пока не найдете конец функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...