Извлечь информацию о классе

Мне нужно создать какую-то документацию для моего кода. Для этого я должен извлечь информацию из нескольких сотен классов C#.

В основном каждый класс содержит некоторый метод MyMethod, В этом методе может быть switch дело с несколькими случаями. Общая структура кода выглядит следующим образом

MyMethod()
{
..some code..

switch (variable)
    case "A":
          break;
    case "B":
          break;

..some other code..
}

Все, что мне нужно, это поиск случая переключения в MyMethod и извлечь case ценности.

До сих пор я придумал вариант использовать Roslyn или Nrefactory для анализа всех файлов.cs, а затем с помощью AST изучать их для извлечения нужных мне узлов AST.

Но этот подход выглядит немного странно, поскольку задача, вероятно, может быть полностью автоматизирована каким-либо другим способом. У меня есть четкая структура файлов, я точно знаю имя метода, которое мне нужно проверить, и есть только одно switch утверждение внутри него. Всегда.

Существуют ли другие удобные способы извлечения информации и создания этой документации?

2 ответа

Решение

Единственное, о чем я могу думать, это либо анализировать файлы C#, либо анализировать скомпилированный IL с использованием Mono.Cecil или аналогичного. В первом случае мой друг написал парсер C#, доступный здесь.

Конечно, если вы идете по пути parse-cs, Roslyn теперь является подходящим вариантом, как вы упомянули. здесь есть краткое введение: http://www.filipekberg.se/2011/10/20/using-roslyn-to-parse-c-code-files/

Вы хотите разобрать код C#. Использование чего-либо кроме правильного синтаксического анализатора C# (такого как Roslyn или NRefactory) приведет к очень хрупкому коду.

Например, вы начнете с поиска строки void MyMethod(), Тогда вы обнаружите, что один тип имеет void MyMethod( ) вместо этого, чтобы вы изменили поиск на регулярное выражение void\s+MyMethod\s*\(\s*\), Тогда какой-то файл будет содержать void MyMethod() в комментарии или в строке, так что вы напишите код, который (неидеально) обнаруживает комментарии и строки.

Через некоторое время вы достигли точки, когда вы постепенно создали очень примитивный синтаксический анализатор C#, и вы боитесь, какой код он должен будет поддерживать дальше.

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

Другие вопросы по тегам