将例如decimal
转换为string
时,可以使用CultureInfo.InvariantCulture
并将其作为IFormatProvider
传递。但为什么这个过载不在object
?为什么对象没有接受IFormatProvider的重载?
一个很好的实现是:
public virtual string ToString()
{
// yadayada, usual ToString
}
public virtual string ToString(IFormatProvider provider)
{
return ToString();
}
这会造成任何损害或受益于object
类,但是从它派生对象可以代替重载过载,这将是一个更容易的时候调用它你不确定这种类型。
使我碰到这个问题是当我正在做一个方法,将获得一个类的所有属性,并将其写入XML。由于我不想检查对象的类型,我只是打电话给ToString
。但是,这是十进制的,输出将基于线程的CurrentCulture
,这不是最优的。我能看到的唯一解决方法是将CurrentCulture
更改为InvariantCulture
,然后将其更改回以前的状态。但是,这也只是丑,我会写尝试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'其实更有意义 – dlev
@ dlev:我不同意 - OP特别希望*只是*格式化。鉴于类型可以很容易地实现IFormattable但不是IConvertible,并且IFormattable中的单一方法恰好是OP想要调用的方法,我认为IFormattable更有意义。 –
@Jon基于OP的问题,看起来他有实际使用'IConvertible'版本的'ToString()'的经验,这就是我提到它的原因。虽然你的观点很好。 – dlev