是否可以将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);

最佳答案

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}")选择第二个重载而不是第一个重载。我知道该怎么办...

关于c# - 在FormattableString和(str,params object [])之间转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51655642/

10-10 20:55