【发布时间】:2011-11-23 04:37:48
【问题描述】:
例如,当将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 上没有这种重载有什么好处?
【问题讨论】:
标签: c# .net object globalization