gpt4 book ai didi

c# - 给定一个可格式化字符串,是否有一种干净的方法来获取给定参数的格式化字符串?

转载 作者:行者123 更新时间:2023-12-02 01:45:03 24 4
gpt4 key购买 nike

假设我有一个像这样的FormattableString:

var now = DateTime.Now;
FormattableString str = $"Today's date is: {now:yyyy-MM-dd} and some numbers: {new[]{1,2,3}}";

我正在尝试获取一个格式字符串并将其转换为在另一个组件中使用。就我而言,本质上是在值处拆分格式字符串,以便我可以控制它们的连接方式,但我需要参数的格式字符串。

FormattableString 上有一些有限的方法,允许我获取参数值 (GetArguments()/GetArgument()) 和原始格式字符串 (Format),但没有用于访问参数格式字符串的字符串。

var format = str.Format; // "Today's date is: {0:yyyy-MM-dd} and some numbers: {1}"
var arguments = str.GetArguments(); // { now, new[]{1,2,3} }

// no simple way to get the "yyyy-MM-dd" part for arg 0

我正在考虑的解决方法是预先格式化该值,以便将格式化的值设置为参数,或者解析出不理想的格式字符串。

void DumpLine(FormattableString format)
{
var values = format.GetArguments().Prepend(null);
var parts = Regex.Split(format.Format, @"\{[^}]+\}");
Util.HorizontalRun(false, values.Zip(parts).SelectMany(x => new[] { x.First, x.Second }).Skip(1)).Dump();
}

// usage
DumpLine($"Today's date is: {now.ToString("yyyy-MM-dd")} and some numbers: {new[]{1,2,3}}");

这是否受支持,也许是通过辅助类,还是我运气不好?


感谢 mariusz96 指出新的 InterpolatedStringHandler 功能。它对我来说正是我所需要的。它甚至足够灵活,让我可以在将来需要时添加其他参数。这就是我最终得到的结果:

public static class UtilEx
{
public static object Interpolate(IFormatProvider provider, [InterpolatedStringHandlerArgument(nameof(provider))] InterpolateFormatHandler handler) => Interpolate(handler);
public static object Interpolate(InterpolateFormatHandler handler) => Util.HorizontalRun(false, handler.Items);

[InterpolatedStringHandler]
public ref struct InterpolateFormatHandler
{
private readonly IFormatProvider? provider;
public InterpolateFormatHandler(int _literalLength, int _formattedCount, IFormatProvider? provider = default) => this.provider = provider;
public List<object?> Items { get; } = new();

public void AppendLiteral(string s) => Items.Add(s);
public void AppendFormatted<T>(T t, int alignment, string format) => Items.Add(string.Format(provider, $"{{0,{alignment}:{format}}}", t));
public void AppendFormatted<T>(T t, int alignment) => Items.Add(string.Format(provider, $"{{0,{alignment}}}", t));
public void AppendFormatted<T>(T t, string format) => Items.Add(string.Format(provider, $"{{0:{format}}}", t));
public void AppendFormatted<T>(T t) => Items.Add(t);
}
}

最佳答案

这可以通过自定义InterpolatedStringHandler来实现。 .

它具有采用对齐和格式的重载。

关于c# - 给定一个可格式化字符串,是否有一种干净的方法来获取给定参数的格式化字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71005770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com