Al convertir, por ejemplo, un decimal
en un string
, utiliza el CultureInfo.InvariantCulture
y lo pasa como IFormatProvider
. ¿Pero por qué esta sobrecarga no está en object
?¿Por qué el objeto no tiene una sobrecarga que acepta IFormatProvider?
Una aplicación agradable sería:
public virtual string ToString()
{
// yadayada, usual ToString
}
public virtual string ToString(IFormatProvider provider)
{
return ToString();
}
Esto causaría ningún daño o beneficio para la clase object
, pero los objetos que se derivan de ella en lugar puede anular la sobrecarga y será mucho más fácil llamarlo cuando no está seguro del tipo.
El problema que me hizo tropezar con esto fue cuando estaba haciendo un método que sería obtener todas las propiedades de una clase y escribirla en xml. Como no quería verificar el tipo de objeto, acabo de llamar al ToString
. Pero si esto hubiera sido un decimal, la salida se basaría en el CurrentCulture
del subproceso, que no es óptimo. La única solución que puedo ver es cambiar el CurrentCulture
al InvariantCulture
y luego volver a cambiarlo a lo que era antes. Pero eso sería feo como yo tendría que escribir probar finalmente se hace etc.
Mi código actual es:
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());
}
}
pero yo quiero que sea:
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));
}
}
Cualquier beneficio de no tener esta sobrecarga en object
?
'IConvertible' realidad tiene más sentido – dlev
@ dlev: No estoy de acuerdo: el OP específicamente quiere * solo * formatear. Dado que los tipos pueden implementar fácilmente IFormattable pero no IConvertible, y que el único método en IFormattable es exactamente el que OP desea llamar, creo que IFormattable tiene más sentido. –
@Jon Basado en la pregunta de OP, parece que tiene experiencia con el uso de la versión 'IConvertible' de' ToString() ', que es la razón por la que lo mencioné. Sin embargo, tu punto está bien tomado. – dlev