将例如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 块等。
我的当前代码如下:
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
上重载的任何好处吗?
IConvertible
版本的ToString()
的经验,这就是为什么我提到它的原因。不过,你也说得很对。 - dlev