2012-03-19 17 views
5

Duplicar posibles:
How can I fix this up to do generic conversion to Nullable<T>?¿Cómo escribir un método de conversión genérico que permita la conversión a tipos anulables?

public static class ObjectExtensions 
    { 
     public static T To<T>(this object value) 
     { 
      return (T)Convert.ChangeType(value, typeof(T)); 
     } 
    } 

Mi método de extensión por encima de ayuda a la conversión de un tipo a otro tipo, pero no es compatible con los tipos anulables.

Por ejemplo, {0} funciona bien, pero {1} no funciona:

{0}: 
var var1 = "12"; 
var var1Int = var1.To<int>(); 

{1}: 
var var2 = "12"; 
var var2IntNullable = var2.To<int?>(); 

Por lo tanto, la forma de escribir un método de conversión genérica lo que apoyaría la conversión hacia y desde los tipos anulables?

Gracias,

+0

has necesitado '' anulable ? –

+0

@MrLister, no puede especificar un tipo dentro del método genérico. –

Respuesta

11

Esto funciona para mí:

public static T To<T>(this object value) 
{ 
    Type t = typeof(T); 

    // Get the type that was made nullable. 
    Type valueType = Nullable.GetUnderlyingType(typeof(T)); 

    if (valueType != null) 
    { 
     // Nullable type. 

     if (value == null) 
     { 
      // you may want to do something different here. 
      return default(T); 
     } 
     else 
     { 
      // Convert to the value type. 
      object result = Convert.ChangeType(value, valueType); 

      // Cast the value type to the nullable type. 
      return (T)result; 
     } 
    } 
    else 
    { 
     // Not nullable. 
     return (T)Convert.ChangeType(value, typeof(T)); 
    } 
} 
+0

bueno, ta. solo un punto; no son solo los tipos de valores que pueden ser anulables, p. ¿Fecha y hora? (DateTime es en sí mismo un tipo de referencia, por lo que sé), por lo que los comentarios del código pueden necesitar ser corregidos;) –

+0

no - DateTime es un tipo de valor, ya que es una estructura. Solo las clases son tipos de referencia en .NET – RobSiklos

+0

¡tienes razón! ya debería haber verificado! –

Cuestiones relacionadas