2009-06-19 9 views
6

mam 3 podobne funkcje, które zmieniają się w zależności jedynie od typu numerycznego:Tworzenie ogólny sposób przekształcania ciąg liczb pustych

<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 

starałem się uczynić rodzajowe funkcji się z tego, ale nie mógł Zrób to. Jak mogę utworzyć funkcję ogólną, która zajmie określoną T i sprawi, że będzie Nullable (of T)?

Odpowiedz

10

Jest identyczny pytanie tutaj (w języku 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

To źle, nie ma metody Convert.TryChangeType, która zapisywałaby konieczność jedzenia wyjątku, gdy ciąg wejściowy nie jest prawidłowy. – jjxtra

3

Jak o:

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 

(zauważ użyłem reflektor tłumaczyć, że z C# poniżej)

You może dodać try/catch wokół ConvertFromInvariantString, ale szczerze mówiąc wolałbym, aby kod rzucił wyjątek, jeśli dam mu coś stoopid - zostaw puste dla pustego walizka.

Zaletą tego jest to, że działa z własnymi strukturami, o ile kojarzysz z nimi konwerter typów, który możesz łatwo wykonać (z atrybutem lub w czasie wykonywania).

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