我可以将FormattableString
转换为String.Format()使用的内容吗,反之亦然?
我可以将$“ val = {x}”转换为("val={0}", new[]{x})
吗?
还是我可以定义一个接受(FormattableString s)
或(string s, params object[])
的方法?
我正在尝试将以下两个方法实现为一个方法,而无需代码重复:
public void Log(FormattableString formatStr)
{
Console.WriteLine(str.ToString());
foreach (var arg in str.GetArguments().OfType<MyClass>())
Console.WriteLine(arg.GetDescription());
}
public void Log(String formatStr, params object[] args)
{
Console.WriteLine(formatStr, args);
foreach (var arg in args.OfType<MyClass>())
Console.WriteLine(arg.GetDescription());
}
以便以下两个调用执行相同的代码:
var x = new MyClass();
Log($"val={x}");
Log("val={0}", x);
答案 0 :(得分:3)
FormattableString
已经具有参数和格式字符串,因此只需委托:
public void Log(FormattableString formatStr) =>
Log(formatStr.Format, formatStr.GetArguments());
public void Log(String formatStr, params object[] args)
{
Console.WriteLine(formatStr, args);
foreach (var arg in args.OfType<MyClass>())
{
Console.WriteLine(arg.GetDescription());
}
}
如注释中所述,它具有不幸的属性,Log($"x={x}")
选择了第二个重载而不是第一个重载。我知道该怎么办...