2009-06-19 6 views
6

tengo 3 funciones similares, que sólo cambian en dependencia de tipo numérico:Creación de un método genérico para la conversión de cadenas a números anulables

<Extension()> _ 
Public Function ToNullableShort(ByVal str As String) As Short? 
    Dim intReturn As Short 
    If Short.TryParse(str, intReturn) Then 
     Return intReturn 
    Else 
     Return Nothing 
    End If 
End Function 

<Extension()> _ 
Public Function ToNullableByte(ByVal str As String) As Byte? 
    Dim intReturn As Byte 
    If Byte.TryParse(str, intReturn) Then 
     Return intReturn 
    Else 
     Return Nothing 
    End If 
End Function 

<Extension()> _ 
Public Function ToNullableLong(ByVal str As String) As Long? 
    Dim intReturn As Long 
    If Long.TryParse(str, intReturn) Then 
     Return intReturn 
    Else 
     Return Nothing 
    End If 
End Function 

yo estaba tratando de hacer una función genérica de esto, pero no pudo hazlo. ¿Cómo puedo hacer una función genérica que tomará una T específica y la convertirá en Nullable (de T)?

Respuesta

10

Hay una pregunta idéntica aquí (en C#): Convert string to nullable type (int, double, etc...)

Public Function ConvertString(Of T As Structure)(ByVal value As String) As System.Nullable(Of T) 
    Try 
     Return DirectCast(Convert.ChangeType(value, GetType(T)), T) 
    Catch 
     Return Nothing 
    End Try 
End Function 
+1

Es una lástima que no hay un método Convert.TryChangeType, que ahorraría tener que comer una excepción cuando la cadena de entrada no es válida. – jjxtra

3

¿Qué tal:

Public Shared Function Parse(Of T As Structure)(ByVal value As String) As T? 
    If String.IsNullOrEmpty(value) Then 
     Return Nothing 
    End If 
    Return New T?(DirectCast(TypeDescriptor.GetConverter(GetType(T)).ConvertFromInvariantString(value), T)) 
End Function 

(nota Solía ​​reflector de traducir que desde el C# abajo)

Usted podría agregar try/catch alrededor del ConvertFromInvariantString, pero para ser honesto, prefiero que el código arroje una excepción si le doy algo stoopid - deje nulls para el espacio en blanco caso.

La ventaja de esto es que funciona con sus propias estructuras, siempre que asocie un convertidor de tipo con ellas, lo cual puede hacer fácilmente (con un atributo o en tiempo de ejecución).

public static T? Parse<T>(string value) where T : struct 
{ 
    if (string.IsNullOrEmpty(value)) return null; 
    return (T)TypeDescriptor.GetConverter(typeof(T)) 
     .ConvertFromInvariantString(value); 
} 
Cuestiones relacionadas