Извлечь информацию о классе
Мне нужно создать какую-то документацию для моего кода. Для этого я должен извлечь информацию из нескольких сотен классов 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#, у вас не будет таких проблем. Так что, если исполнение этого совершенно неприемлемо для вас, я думаю, вы должны его использовать.