gpt4 book ai didi

c# - 使用 StringFormat 转换为字符串

转载 作者:行者123 更新时间:2023-11-30 14:55:44 24 4
gpt4 key购买 nike

我想为泛型类编写一个 ToString() 方法,我可以在其中指定 StringFormat。

到目前为止,我有以下代码:

public class Foo<T> : IFoo
{
public T Value { get; set; }
string IFoo.Value { get { ValueToString(Value); } }

public string StringFormat { get; set }

public Foo(T value, string stringFormat)
{
Value = value;
StringFormat = stringFormat;
}

private string ValueToString(T value)
{
if (!string.IsNullOrEmpty(StringFormat))
{
var formattable = value as IFormattable;
if (formattable != null)
{
var format = CultureInfo.CurrentCulture.GetFormat(typeof(T)) as IFormatProvider;
if (format != null)
return formattable.ToString(StringFormat, format);
}
}

return Convert.ToString(value);
}
}

public interface IFoo
{
string Value { get; }
}

我这样调用代码:

public class Bar
{
public Bar()
{
var dateTimeFoo = new Foo<DateTime>(DateTime.Now, "dd.MM.yyyy");
var iFoo = dateTimeFoo as IFoo;
if (Convert.ToString(dateTimeFoo.Value) != iFoo.Value)
{
//stringformat worked...
}
}
}

我当前实现的问题是这行代码:

var format = CultureInfo.CurrentCulture.GetFormat(typeof(T)) as IFormatProvider;

它返回 null,对于没有 FormatProvider 但有 DateTime 的对象,它应该返回 null肯定有能力,我怎样才能得到一个泛型T的正确FormatProvider

最佳答案

CultureInfo 已经实现了 IFormatProvider,您要做的就是

return formattable.ToString(StringFormat, CulturuInfo.CurrentCulture);

如果您查看GetFormat 方法的实现

public virtual Object GetFormat(Type formatType)
{
if (formatType == typeof (NumberFormatInfo))
{
return (NumberFormat);
}
if (formatType == typeof (DateTimeFormatInfo))
{
return (DateTimeFormat);
}
return (null);
}

你可以看到它只支持两种类型并且返回null 否则as documented here

关于c# - 使用 StringFormat 转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24800210/

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