Как стать автором
Обновить

Комментарии 4

А сложные объекты кроме namespace просмотреть можно?
Мы при сохранении делаем ToString значениям параметров. Поэтому всё от реализации ToString() в конкретном объекте зависит.
А кто мешает просто использовать регулярные выражения на этапе компиляции?
Делается таким образом:
1) Написать класс, скажем FunctionEntry, который в конструкторе через Reflection сохраняет все параметры функции, в которой он используется, а также ссылку на внешний класс FunctionEntry (из внешней вызывающей функции);
2) Список классов FunctionEntry сохранять в локальной памяти потока (для того, чтобы можно было узнать внешний класс FunctionEntry без передачи его в качестве параметра функции);
3) Написать утилиту времени компиляции (вызов которой будет происходить каждый раз при сборке проекта), которая с использованием регулярных выражений
a) определяет начало каждой используемой функции и вставляет в нее создание класса FunctionEntry; а также начало блока try;
b) определяет конец каждой используемой функции и вставляет в нее блок catch, который ловит исключение и при помощи списка классов FunctionEntry из локальной памяти потока находит значения всех параметров
4) После завершения компиляции обратная утилита убирает все вставленные блоки.
Для языка C++, кстати, C#-регулярка поиска начала функции (без ref-квалификаторов) выглядит так:
@"((?<!\b(?:switch|for|while|if|catch)\s*)\((?:[^'""()]|'(?:[^']|\\.)*'|""(?:[^""]|\\.)*""|(?'open'\()|(?'-open'\)))*(?(open)(?!))\)\s*(?:const\s*)?(?:override\s*)?\{)"
Зарегистрируйтесь на Хабре, чтобы оставить комментарий