Подтвердить что ты не робот

Как сделать свой собственный метод похожим на String.Format с помощью Composite Formatting в С#

Мне нравится, как String.Format использует аргументы для вставки переменных в строку, которую он форматирует. Это называется Composite Formating и обсуждается в MSDN здесь.

Я хочу эту функциональность с моим фасадом ведения журнала:

string foo = "fancy";
string bar = "message";
log.Debug("My {0} log {1}.", foo, bar)

My ILoggerFacade имеет следующую подпись метода:

void Debug<T>(T message, params Object[] args);

И я знаю, что могу реализовать это довольно просто:

ILog m_Log = \\some logging implementation
public void Debug<T>(T message, params Object[] args)
{
    m_Log.Debug(String.Format(message, args));
}

Однако в Visual Studio я не получаю причудливого выделения аргументов {0}, {1},...:

Argument highlighting for Composite Formatting methods

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

Как получить подсветку аргументов и "intellisense" для пользовательских форматированных методов, аналогичных тем, как они работают:

Console.WriteLine(...)
String.Format(...)
etc...

Любая помощь будет оценена.

4b9b3361

Ответ 1

Проверьте ReSharpers Внешние аннотации. В частности, вы хотите использовать StringFormatMethodAttribute для этого.

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

  • Ссылка "JetBrains.Annotations.dll". Я бы рекомендовал против этого. Мне не нравится идея копирования DLL или ссылки на каталог установки ReSharper. Это может вызвать проблемы при обновлении или повторной установке.

  • Копирование и вставка объявлений атрибутов в ваше решение. Я бы рекомендовал это, так как он дает вам больше контроля. Кроме того, вы можете избавиться от ReSharper (зачем кому-то это делать?). По-моему, странные вещи произошли, и по-прежнему предоставляют эту возможность всем, кто потребляет вашу библиотеку. Есть пошаговые инструкции о том, как это сделать в первой ссылке.

  • Создайте XML файл, аналогичный тому, что он использует для сборков .NET. Я сделал это для Silverlight Unit Test Framework. ReSharper не распознает эти тесты по умолчанию.

    Для этого

    • Создайте имя файла <assembly>.xml и поместите его в "ReSharper\vXX\Bin\ExternalAnnotations".
    • Добавить корневой элемент "<assembly name="<assembly>">
    • Теперь добавьте элементы <member> для каждого члена, которые вы хотите предоставить атрибуту.

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