Найти методы в файле c # программно - PullRequest
3 голосов
/ 26 мая 2010

Я хочу написать код для поиска определения метода и методов, вызываемых в файле c #.

Так что, очевидно, мой шаблон должен искать текст вроде

1. public void xyz (blahtype blahvalue);

конструкция 2.string = SearchData (blahvalue);

Кто-нибудь делал подобное, полезен ли Regex в этом случае. если да, предоставьте мне образец. Любые другие обходные пути. Я не знаю отражения (это поможет в моем случае)


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

открытый метод1 (int val)

{

* * Метод2 тысячу двадцать-одина (); * * тысяча двадцать-дв

method3 ();

}

void method2 (int val2)

{

method4 ()

}

Я хотел построить строку как Метод1: Метод2: метод4 и Метод1: Метод3 ....

Я думаю, это действительно сложно

Ответы [ 3 ]

2 голосов
/ 26 мая 2010

С помощью отражения вы можете загрузить сборку и выяснить, какие методы и т. Д. Она содержит, чтобы она звучала так, как вам нужно, если только я не неправильно понял вопрос и вы хотите посмотреть исходные файлы.

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

Type.GetMethods
http://msdn.microsoft.com/en-us/library/4d848zkb.aspx

Assembly.GetTypes
http://msdn.microsoft.com/en-us/library/system.reflection.assembly.gettypes.aspx

1 голос
/ 26 мая 2010

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

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

Существует много модификаторов, и они не допускаются в любом порядке (хотя моя попытка допускает также недопустимые комбинации). За модификаторами следует тип возвращаемого значения. Это кажется простым на первый взгляд, но это не так. Возвращаемый тип может быть универсальным типом с произвольным количеством и сколь угодно глубокими аргументами вложенного типа. Моя попытка вообще не разрешает генерики.

Имя метода будет довольно простым, но моя попытка в настоящее время неверна - имя не должно начинаться с цифры, вы можете использовать @ в именах методов, и, возможно, есть еще несколько пропущенных точек. Тогда список параметров. Снова могут быть общие типы и модификаторы ref и out. Наконец, могут быть ограничения общего типа. И не забывать типы указателей в небезопасных контекстах.

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

 ((public|protected|internal|private|static|abstract|sealed|extern|override|new|virtual)\s+)*[a-zA-Z0-9_]+\s+[a-zA-Z0-9_]+\s*\(.*\)
1 голос
/ 26 мая 2010

Если вы хотите искать файлы кода с помощью регулярных выражений, попробуйте это:

(?<=^|;|\{|\})[^;{}]*\s([\w.]+)\s*\([^;{}]*

Он должен соответствовать каждой строке с определением или вызовом метода и иметь имя метода в своей первой группе захвата. Попробуйте RegExr посмотреть на него в действии.

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

Редактировать: Как указывает "ho" в комментарии к другому ответу, это регулярное выражение, конечно, подберет if и for. Больше фильтрации, я думаю. =)

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