如何在C#中使用复合格式创建类似于String.Format的自己的方法

时间:2012-08-23 13:04:38

标签: c# resharper syntax-highlighting

我喜欢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},...参数的精彩突出显示:

Argument highlighting for Composite Formatting methods

我想是ReSharper对他们负责,看起来它只是忽略了格式化参数而没有提供“intellisense”帮助。这是不好的,因为将使用外观的其他开发人员将期待这一点。

如何为自定义格式化方法获取参数突出显示和“intellisense”,类似于以下方法:

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

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:29)

查看ReSharpers External Annotations。具体来说,您希望使用StringFormatMethodAttribute

要使用外部注释,实际上有3种方法。两个它拼出来的,你需要在两行之间阅读。

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

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

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

    要做到这一点

    1. 创建文件名<assembly>.xml并将其放入“ReSharper \ vXX \ Bin \ ExternalAnnotations”。
    2. 添加根元素"<assembly name="<assembly>">
    3. 现在为要为其提供属性的每个成员添加<member>个元素。
    4. 我不建议您为自己的代码执行此操作。但是,如果您有一个要获得此功能但无法编辑的程序集,则可以使用此方法。这仅适用于您的计算机,并且使用程序集的每个开发人员都需要复制xml文件。