Отражение или регулярное выражение для пользовательских атрибутов - PullRequest
1 голос
/ 26 февраля 2012

Я видел Атрибуты и отражения , и теперь я знаю, как создать и использовать отражение, чтобы увидеть метаданные атрибута, но можно ли создать отдельный инструмент, который может анализировать файл cs и извлекатьиспользуемые атрибуты?

Что я пытаюсь сделать?

В основном я работаю над инструментом, который принимает C# code в качестве входных данных.Следующий шаг - посмотреть, какие атрибуты используются в этом исходном коде.Извлечь Intrinsic и Custom Attributes.

Probem?

это имеет смысл, если вы используете reflection в том же проекте, в котором определены ваши attributesоднако I do not know in what direction I should move написал отдельный инструмент, который может предоставить вам извлеченную статику и метаданные атрибутов.

Некоторые говорят, что я должен использовать Regex для извлечения атрибутов в файлах, где, как другие говорят, мне нужноиспользуйте Irony - .NET Language реализации Kit

Кроме того

выше работа приведет к тому, что у меня будет приложение, которое будет использоваться для attributes(annotation) based Design Pattern Recoveryот Source Code.У меня меньше идей, если Regex придет на помощь или мне понадобится что-то вроде Reflection.Как Reflection имеет дело со временем выполнения.Я не должен иметь дело со временем выполнения.просто статический анализ файлов

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

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

Если вы не знаете, какой синтаксический анализатор выбрать - я бы порекомендовал Rosalyn, так как он должен быть наиболее простым для анализа кода C # (он разработан специально для него). Вы можете найти пример для разбора здесь: http://blog.filipekberg.se/2011/10/20/using-roslyn-to-parse-c-code-files/

Я думаю, что это должно быть действительно мощным и полезным для вашей задачи

2 голосов
/ 26 февраля 2012

Очевидно, у меня недостаточно репутации, чтобы комментировать, поэтому я должен сказать это как ответ.

Отражение касается информации о типе среды выполнения. Это механизм для обнаружения вещей о типе, о которых вы, программист, еще не знаете (возможно, кто-то еще предоставляет вам библиотеку кода и забыл задокументировать ее). Reflection предоставит вам любую необходимую вам информацию о публичном контракте класса, включая методы, свойства, поля, атрибуты и унаследованные интерфейсы / классы.

То, что вам нужно, однако, является парсером. Парсер - это стандартная концепция программирования, которая обрабатывает файлы и извлекает конкретную информацию. Вы ищете информацию в файлах кода, которые еще не являются типами времени выполнения, что означает, что у отражения пока нет информации о них, как бы вы ни были, поскольку они все еще являются файлами кода. В случае, если ваши глаза не достаточно (как я подозреваю, нет, если вы задали вопрос), вам нужно написать парсер. Извлечение конкретной информации из файла CS довольно просто. И регулярное выражение для атрибута: \[.+\]

...