Как получить классы и методы из файла .cs, используя Reflections в C #.? - PullRequest
1 голос
/ 25 мая 2009

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

Assembly.GetTypes() and Type.GetMethods()

чтобы получить класс и методы в сборке.

Аналогично, как получить все классы, присутствующие в файле C # (файл .cs).? Мне нужно получить классы в файле .cs , из которого я могу легко получить методы внутри них, а также более подробную информацию, такую ​​как параметры методов и т. Д.

Ответы [ 6 ]

3 голосов
/ 25 мая 2009

Если не использовать синтаксический анализатор C # , прямого способа сделать это нет. Вы можете скомпилировать файл .cs, используя CSharpCodeProvider (который работает только в том случае, если файл компилируется сам, и вы можете сообщить все ссылочные сборки компилятору) и использовать отражение в полученной сборке.

1 голос
/ 25 мая 2009

Я рекомендую вам использовать инструмент генератора парсера для генерации быстрого парсера c #, вы можете использовать Antlr .

Также вы можете проверить это и это

0 голосов
/ 25 мая 2009

Прежде всего, не существует такой вещи, как файл .cs, в котором определяется класс. Класс может быть помечен как частичный, а части могут быть определены в нескольких файлах .cs.

Когда вы компилируете с отладочной информацией, имена файлов для каждого метода остаются в сборке (для каждой строки исходного файла помечаются соответствующие команды IL).

К сожалению, я не знаю простого способа получить эту информацию из запущенного приложения (без анализа файла сборки вручную).

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

Итак, единственный путь, которым вы могли бы воспользоваться, - это попытаться проанализировать файл .cs с помощью самого анализатора, такого как AntLR.

0 голосов
/ 25 мая 2009

Я делал это ранее, вызывая компилятор C #, компилируя файл C #, а затем используя отражение в выводимом типе. Это возможно, если файл C # является автономным файлом и не имеет каких-либо зависимостей.

Тем не менее, правильным способом было бы использовать парсер - что-то, что не так просто сделать. Существует несколько доступных вариантов, среди которых MinosseCC.

Между прочим, C # 5.0 значительно упростит компиляцию кода на лету благодаря возможности компилировать строку и возвращать исполняемый код. Не могу дождаться этого - это обязательно запутает всех, кто читает мой код.

0 голосов
/ 25 мая 2009

Из с в классе вы всегда можете позвонить

this.GetType()

или вне класса, вы всегда можете позвонить

obj.GetType()

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

0 голосов
/ 25 мая 2009

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

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