2009-06-19 10 views
6

Ho 3 funzioni simili, che solo cambiano in base al tipo numerico:Creazione di un metodo generico per la conversione di stringhe in numeri nullable

<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 

stavo cercando di fare una generica funzione di questo, ma non poteva fallo. Come posso creare una funzione generica che prenderà una T specifica e la renderà un Nullable (di T)?

risposta

10

C'è una questione identica qui (in 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

È troppo male non esiste un metodo Convert.TryChangeType, che salverebbe dover mangiare un'eccezione quando la stringa di input non è valida. – jjxtra

3

ne dite:

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 

(si noti che ho usato riflettore di tradurre che dalla C# sotto)

È potrebbe aggiungere try/catch intorno allo ConvertFromInvariantString, ma a dire il vero preferirei che il codice generasse un'eccezione se gli dessi qualcosa di stanco - lascia i null per lo spazio vuoto Astuccio.

Il vantaggio di questo è che funziona con le proprie strutture, purché si associ un convertitore di tipi con esse, cosa che si può fare facilmente (con un attributo o in fase di esecuzione).

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