Серый код регистрации с использованием ReSharper

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

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

Я ищу что-то похожее на то, как Debug.WriteLine отображается в режиме Release, хотя я не хочу компилировать код.

Ответ 1

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

Аннотации используются в ReSharper почти повсеместно, так как известно, что серая строка Debug.WriteLine в Release, например, так как строки Debug.Write... украшены атрибутом [Conditional("DEBUG")].

Что вы можете сделать, так это обмануть, заставив ReSharper подумать, что такой условный метод существует в ваших методах регистрации. Вы можете сделать это, применив этот атрибут извне через XML.

Я написал о том, как это сделать в моем блоге, вот как вы могли это сделать:

  • Создайте файл с именем YourLogger.ExternalAnnotations.xml, например. NLog.ExternalAnnotations.xml и поместите его рядом с вашей сборкой журнала.
  • Добавьте следующее:
<assembly name="NLog">
  <member name="M:NLog.Logger.Info(System.String)">
    <attribute ctor="M:System.Diagnostics.ConditionalAttribute.#ctor(System.String)">
      <argument>LOG</argument>
    </attribute>
  </member>
  <member name="M:NLog.Logger.Debug(System.String)">
    <attribute ctor="M:System.Diagnostics.ConditionalAttribute.#ctor(System.String)">
      <argument>LOG</argument>
    </attribute>
  </member>
</assembly>

Для каждого метода, который вы хотите "серого", вам нужно добавить блок <member> с именем XML-Doc ID метода. В ReSharper 8 EAP есть опция Скопировать XML-Doc ID в буфер обмена, расположенную в меню ReSharper Изменить.

Это существенно заставляет механизм ReSharper мыслить там [Conditional("LOG")], определенный в метаданных типа регистратора.

После того, как вы добавили все нужные методы, просто перезагрузите решение. Вы должны получить то, что ищете (вроде... как я уже сказал, это взломать:))

ReSharper hackery

Ответ 2

Просто не делай этого.

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

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