我将如何编写String.Format扩展方法?

时间:2013-05-17 14:55:04

标签: c# string extension-methods

我在C#代码中使用String.Format可能比if语句更重要。

string ask = String.Format("Continue using [{0}]?", value);

我只想到我经常使用它。

接下来,我开始考虑为它创建Extension Method会有多棒。

ask.Format("Continue using [{0}]?", value);

所以,我要看String.Format,它有很多重载,因为有很多方法可以调用它。

嗯......这使事情变得复杂。

是否有一种编写Extension Method的简单方法,它只是建立在System.String命名空间中已存在的重载上?

以下是我希望看到的内容:

public static class Extensions
{
  public static String Format(this String str, String formatText, /* What goes here? */)
  {
    return str.Format(formatText, /* Magic */);
  }
}

我想我可以写一个重载来匹配每个String.Format重载,但这可能没有必要。

4 个答案:

答案 0 :(得分:16)

ask.Format("Continue using [{0}]?", value);

不是我会如何使用它。这就是我要做的事情:

var ask = "Continue using [{0}]?".FormatWith(value);

这是我的扩展方法:

public static string FormatWith(this string value, params object[] args)
{
    return String.Format(value, args);
}

答案 1 :(得分:2)

你很接近,只缺少params object[] args参数:

public static class Extensions
{
  public static String Format(this String str, 
                              String formatText, 
                              params object[] args)
  {
    return str.Format(formatText, args);
  }
}

答案 2 :(得分:2)

您想要修改调用字符串。你不能这样做。 .Net中的字符串不会更改(它们是不可变的),因此您仍然必须返回一个新字符串。你可以从C#得到的最接近的代码如下:

string ask = ask.Format("Continue using [{0}]?", value);

如果可以通过引用传递扩展对象,则可以修改原始字符串。不幸的是,C#不支持这一点。

有趣的是IL 支持它,你可以使用VB.Net编写你想要的方法:

<Extension()> _
Public Shared Sub Format(ByRef str As String, ByVal formatText As String, ByVal ParamArray args As Object())
    str = String.Format(formatText, args);
End Sub

不幸的是,即使你在VB.Net类库项目中填充它,你也无法从C#中调用它,因为C#要求你在调用时在调用站点使用ref关键字通过引用使用参数的函数,并且没有使用扩展方法的语法。

对于与你想要的语法不完全匹配的解决方法,但仍会给你一些相当不错的东西,请参阅Mike Cole's answer

答案 3 :(得分:1)

使用字符串插值(在C#6.0和VS 2015+中)。你的代码看起来像这样:

var ask = $"Continue using [{value}]?";

我一直在使用String.Format或字符串连接,直到我发现字符串插值,现在我已经迷上了。

这样做的一个潜在缺点是,您无法将格式字符串分解为常量或资源。在这里查看更多详细信息:

https://msdn.microsoft.com/en-us/library/dn961160.aspx

本文详细介绍了其他一些不错的宝石。 Definitley值得一读:

https://msdn.microsoft.com/en-us/magazine/dn879355.aspx