2016-02-21 3 views
1

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

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

MyMethod() 
{ 
..some code.. 

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

..some other code.. 
} 

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

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

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

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

+1

Рослин - ваш друг. Это кажется идеальным для SyntaxWalker: https://joshvarty.wordpress.com/2014/07/26/learn-roslyn-now-part-4-csharpsyntaxwalker/ –

ответ

2

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

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

1

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

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

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

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

Смежные вопросы