24

我喜欢 String.Format 如何使用参数将变量注入到它正在格式化的字符串中。这称为复合格式化,并由 MSDN here讨论。

我希望我的日志外观具有此功能:

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

我的 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}、... 参数的花哨突出显示:

复合格式方法的参数突出显示

我猜是 ReSharper 对他们负责,而且它似乎只是忽略了格式化参数并且没有提供“智能感知”帮助。这并不好,因为将使用外观的其他开发人员会期待这一点。

如何为自定义格式化方法获得参数突出显示和“智能感知”,类似于这些方法的工作方式:

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

任何帮助,将不胜感激。

4

1 回答 1

30

查看 ReSharpers外部注释。具体来说,您想为此使用StringFormatMethodAttribute

要使用外部注释,实际上有 3 种方法。两个是它说明的,一个是你必须在字里行间阅读才能看到的。

  1. 参考“JetBrains.Annotations.dll”。我会建议反对这个。我不喜欢复制 DLL 或必须引用 ReSharper 安装目录的想法。如果您升级或重新安装,这可能会导致问题。

  2. 将属性声明复制并粘贴到您的解决方案中。我推荐这个,因为它可以让你有更多的控制权。此外,您可以摆脱 ReSharper(为什么有人会这样做?我猜发生了奇怪的事情。),并且仍然向使用您的库的任何人提供此功能。第一个链接中有关于如何执行此操作的分步说明。

  3. 创建一个类似于用于 .NET 程序集的 XML 文件。我为 Silverlight 单元测试框架做了这个。默认情况下,ReSharper 无法识别这些测试。

    去做这个

    1. 创建一个文件名<assembly>.xml并将其放在“ReSharper\vXX\Bin\ExternalAnnotations”中。
    2. 添加根元素"<assembly name="<assembly>">
    3. <member>现在为要赋予属性的每个成员添加元素。

    我不建议对您自己的代码执行此操作。但是,如果您有一个想要具有此功能但无法编辑的程序集,则可以这样做。这仅适用于您的机器,并且每个使用该程序集的开发人员都需要复制 xml 文件。

于 2012-08-23T13:07:11.133 回答