Estoy intentando hacer alguna conversión de datos. Desafortunadamente, gran parte de los datos están en cadenas, donde deberían ser int o dobles, etc.
Entonces, lo que tengo es algo como:
double? amount = Convert.ToDouble(strAmount);
El problema con este enfoque es que si strAmount está vacío, si está vacío, quiero que sea nulo, por lo que cuando lo agregue a la base de datos, la columna será nula. Así que terminé escribiendo esto:
double? amount = null;
if(strAmount.Trim().Length>0)
{
amount = Convert.ToDouble(strAmount);
}
Ahora esto funciona bien, pero ahora tengo cinco líneas de código en lugar de una. Esto hace que las cosas sean un poco más difíciles de leer, especialmente cuando tengo una gran cantidad de columnas para convertir.
Pensé que usaría una extensión de la clase de cadena y genéricos para pasar el tipo, esto se debe a que podría ser doble, int o largo. Entonces intenté esto:
public static class GenericExtension
{
public static Nullable<T> ConvertToNullable<T>(this string s, T type) where T: struct
{
if (s.Trim().Length > 0)
{
return (Nullable<T>)s;
}
return null;
}
}
Pero recibo el error: ¿No se puede convertir el tipo 'string' a 'T?'
¿Hay alguna forma de evitar esto? No estoy muy familiarizado con la creación de métodos con genéricos.
fuente
Respuestas:
Otra cosa a tener en cuenta es que la cadena en sí misma puede ser nula.
fuente
Puede intentar usar el siguiente método de extensión:
De esta manera puedes hacer esto:
fuente
¿Qué hay de esto?
Por supuesto, esto no tiene en cuenta el error de conversión.
fuente
Escribí este convertidor de tipo genérico. Funciona con valores Nullable y estándar, convirtiendo entre todos los tipos convertibles, no solo cadenas. Maneja todo tipo de escenarios que usted esperaría (valores predeterminados, valores nulos, otros valores, etc.)
He estado usando esto durante aproximadamente un año en docenas de programas de producción, por lo que debería ser bastante sólido.
fuente
OutOfMemoryException
si no puede reducirlo a un conjunto fijo de tipos de excepción.Es posible que desee probar:
haga su propio cheque nulo y devuélvalo
int?
si es necesario. También querrás envolver eso en untry {}
fuente
Dale una oportunidad a esto ...
Entonces llámalo así ...
fuente
Me gusta la respuesta de Joel, pero la he modificado ligeramente, ya que no soy fanático de comer excepciones.
fuente
Puede usar lo siguiente con objetos, desafortunadamente esto no funciona con cadenas.
Lo uso para ajustar una variable de sesión en una propiedad (en una página base) ... por lo que mi uso real es (en mi página base):
Puedo verificar nulo en la lógica de página:
fuente
CType(Object, Nullable(Of Double))
funciona bien con cadenasNo hay forma de evitar esto. Nullable, así como su método, están limitados a usar solo tipos de valor como argumento. La cadena es un tipo de referencia y, por lo tanto, es incompatible con esta declaración.
fuente
fuente
Hay una solución genérica (para cualquier tipo). La usabilidad es buena, pero la implementación debe mejorarse: http://cleansharp.de/wordpress/2011/05/generischer-typeconverter/
Esto le permite escribir código muy limpio como este:
y también:
fuente
typeName.IndexOf
? ¿Realmente?) Y un comportamiento extraño (laTryConvert
función mostrada ni siquiera maneja los valores nulos correctamente).Aquí hay algo basado en la respuesta aceptada. Eliminé el try / catch para asegurarme de que todas las excepciones no se traguen y no se traten. También se aseguró de que la variable de retorno (en la respuesta aceptada) nunca se inicialice dos veces por nada.
fuente
Mi ejemplo para tipos anónimos:
fuente
Otra variante. Éste
NotSupportedException
si no se puede convertir el tipostring
. Por ejemplo, una estructura personalizada sin un convertidor de tipos.(T?)null
si la cadena no se analiza. No es necesario verificar si hay espacios en blanco o nulos.fuente
Agreguemos una solución más similar a la pila. Este también analiza enumeraciones, y se ve bien. Muy seguro.
https://github.com/Pangamma/PangammaUtilities-CSharp/blob/master/PangammaUtilities/Extensions/ToNullableStringExtension.cs
fuente
La respuesta genérica proporcionada por " Joel Coehoorn " es buena.
Pero, esta es otra forma sin usar esos
GetConverter...
otry/catch
bloques ... (no estoy seguro, pero esto puede tener un mejor rendimiento en algunos casos):El uso es el siguiente:
fuente
TypeDescriptor.GetConverter
... códigos. Esta es solo otra forma.