Если код компилируется, вы можете скомпилировать его во время выполнения и использовать отражение для получения определений метода. Получение вызовов методов будет немного сложнее, потому что вам придется анализировать код 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*\(.*\)