При преобразовании, например, десятичного
в строку
, вы используете CultureInfo.InvariantCulture
и передайте его как IFormatProvider
.Но почему этой перегрузки нет в объекте
?
Хорошей реализацией будет:
public virtual string ToString()
{
// yadayada, usual ToString
}
public virtual string ToString(IFormatProvider provider)
{
return ToString();
}
Это не принесет вреда или пользы классу объекта
, но объектам, производным от него может вместо этого переопределить перегрузку, и ее будет намного проще вызвать, если вы не уверены в типе.
Проблема, которая заставила меня столкнуться с этим, заключалась в том, что я создавал метод, который бы получал все свойства класса и записывал их в 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));
}
}
Любая выгода от отсутствия этой перегрузки на объект
?