是否可以将插值字符串作为参数传递给方法?

Rre*_*Cat 8 c# string-interpolation c#-6.0

我已经开始使用Interpolated Strings(C#6的新功能),它非常有用且优雅.但根据我的需要,我必须将字符串格式作为参数传递给方法.像下一个:

MyMethod(string format)
Run Code Online (Sandbox Code Playgroud)

在过去,我在下一个方面使用它:

MyMethod("AAA{0:00}")
Run Code Online (Sandbox Code Playgroud)

现在我尝试了这段代码:

MyMethod($"AAA{i:00}")
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为它i是在方法内部创建的,并且在此上下文中超出了范围.

是否可以使用任何技巧将插值字符串作为参数传递给方法?

Kob*_*obi 7

你不能这样做,这也不是一个好主意 - 它意味着你正在使用另一种方法的局部变量.
这将破坏此功能的目的 - 使编译器可验证字符串插值并绑定到局部变量.

C#有几个不错的选择.例如,使用Func:

public void MyMethod(Func<int,string> formatNumber)
{
    int i = 3;
    var formatted = formatNumber(i);
}
Run Code Online (Sandbox Code Playgroud)

用于:

MyMethod(number => $"AAA{number:00}");
Run Code Online (Sandbox Code Playgroud)

这比你现在拥有的要好 - 你有格式字符串(s?)及其在不同地方的用法.

如果你有多个变量,这种方法可以扩展,但考虑将它们分组到一个类(或结构) - func看起来会更好,你的代码将更具可读性.此类也可以覆盖.ToString(),这可能对您有用.

另一个简单的选择是仅传递格式:MyMethod("00")i.ToString(format),但这仅适用于您可能简化的示例.


Pau*_*ado 5

有几种方法可以做到这一点。

第一个方法是添加另一个方法重载,该方法重载采用FormattableString(字符串内插变体之一使用的新类型)并调用原始方法:

public void MyMethod(FormattableString fs)
{
    MyMethod(fs.Format);
}
Run Code Online (Sandbox Code Playgroud)

如果需要,您还可以访问参数。

如果只需要格式,则只需创建一个扩展方法即可将其提取:

public static string AsFormat(FormattableString fs)
{
    return fs.Format;
}
Run Code Online (Sandbox Code Playgroud)

  • 我不知道这是否能回答原始问题,但这是延迟字符串插值的好方法。非常适合在条件日志记录等中使用。 (4认同)
  • 我认为这行不通,因为“`i`是在方法内部创建的”。 (2认同)