gpt4 book ai didi

c# - 为什么对象没有接受 IFormatProvider 的重载?

转载 作者:IT王子 更新时间:2023-10-29 04:14:15 25 4
gpt4 key购买 nike

例如,当将 decimal 转换为 string 时,您使用 CultureInfo.InvariantCulture 并将其作为 IFormatProvider。但为什么这个重载不在 object 中?

一个不错的实现是:

public virtual string ToString()
{
// yadayada, usual ToString
}

public virtual string ToString(IFormatProvider provider)
{
return ToString();
}

这不会对 object 类造成伤害或好处,但是从它派生的对象可以覆盖重载,并且当您不确定类型时调用它会容易得多。

让我遇到这个问题的原因是我正在制作一个方法,该方法将获取类的所有属性并将其写入 xml。因为我不想检查对象的类型,所以我只是调用了 ToString。但如果这是一个小数,输出将基于线程的 CurrentCulture,这不是最优的。我能看到的唯一解决方法是将 CurrentCulture 更改为 InvariantCulture,然后将其更改回之前的状态。但这会很难看,因为我必须编写 try finally block 等。

我当前的代码是:

        foreach (var property in typeof(Order).GetProperties(BindingFlags.Public | BindingFlags.Instance).
Where(c => ValidTypes.Contains(c.PropertyType)))
{
var value = property.GetValue(order, null);
if (value != null)
{
writer.WriteElementString(property.Name,
value.ToString());
}
}

但我希望它是:

        foreach (var property in typeof(Order).GetProperties(BindingFlags.Public | BindingFlags.Instance).
Where(c => ValidTypes.Contains(c.PropertyType)))
{
var value = property.GetValue(order, null);
if (value != null)
{
writer.WriteElementString(property.Name,
value.ToString(CultureInfo.InvariantCulture));
}
}

不对 object 重载有什么好处?

最佳答案

尝试将您的转换为IFormattable:

foreach (var property in typeof(Order).GetProperties(BindingFlags.Public | BindingFlags.Instance).
Where(c => ValidTypes.Contains(c.PropertyType)))
{
var value = property.GetValue(order, null);
if (value != null)
{
var formattable = value as IFormattable;
writer.WriteElementString(property.Name,
formattable == null ? value.ToString() : formattable.ToString(null, CultureInfo.InvariantCulture));
}
}

关于c# - 为什么对象没有接受 IFormatProvider 的重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7521306/

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