2012-06-29 2 views
3

Несколько лет назад Эрик Липперт blogged о гипотетическом операторе информации, который позволит вам получить информацию о методе/свойствах во время компиляции во время выполнения. В основном говорят, что это хороший пони, но не единорог ....Недвижимость-aka infoof - через Rosyln?

Я немного читал о способности Розильна переписывать ваш код во время компиляции, насколько сложно было бы реализовать информацию с использованием Roslyn?

EDIT: Я думал, что это может быть способ получить все, что Эрик сказал, о чем вы думали, но я должен был сломать функции немного, если бы это было не так.

  1. Получить название объекта недвижимости.
  2. Получить тип недвижимости.
  3. Получить принадлежности для доступа к объекту.
  4. Получить имя метода.
  5. Получить все, что он подразумевает под infoof ...

В рефакторинга безопасный способ, который получает проверено во время компиляции. Для меня лично 1 охватывает около 90% того, что я бы использовал (новый атрибут информации об абоненте для получения имени вызывающего абонента может фактически покрыть около 60%, но, конечно, если бы был способ, который работал как внутри, так и снаружи метода , что было бы предпочтительнее).

+0

Я сомневаюсь, что это возможно. С 'typeof' аргумент оператора четко определен и не существует двусмысленности (существует только один тип с конкретными параметрами имени и типа, оставляя в стороне проблему с пространством имен). Однако, как «информация» будет различать, например, 'void MyFunc (string arg)' и 'void MyFunc (int arg)'? – penartur

+0

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

+0

Просто создайте делегата и получите 'Target'. – leppie

ответ

4

Вы можете легко использовать Roslyn для перезаписи одного действительного кода C# на другой действительный код C#. Но он не предназначен для добавления расширений к языку.

Рослин делает разбора недопустимый код тоже (он должен, если вы хотите использовать его для IntelliSense на неполной строки), но так как он недействителен, нет никакой гарантии, что будет делать это правильно (потому что не ясно, что именно означает «правильно»). Кроме того, я думаю, что структура, которую он будет использовать для infoof, будет не очень удобной для вас.

Подводя итог: это не то, что Roslyn предназначено для использования и делает это, вероятно, плохая идея. Но я думаю, что это невозможно сделать с помощью Рослина.

+2

Это не то, что это значит для нет, но мы хотели бы, чтобы вы это попробовали. :-) И если вы правильно выбрали свой синтаксис, вы все равно могли бы получить что-то, что будет анализировать как действительный C#. Например, infoof (Foo) будет анализировать (хотя и не связывать семантически) как выражение вызова. –

+0

@JasonMalinowski Да, я попробовал более сложный случай 'infoof (Foo (string))', и он по-прежнему синтаксически корректен, как вызов в вызове. Вы правы, с правильным синтаксисом, что-то вроде этого может работать надежно. – svick

Смежные вопросы