2009-06-19 83 views
6

我有3種類似功能的通用方法,即只改變基於數值類型:創建轉換字符串可空號

<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 

我試圖讓一個泛型函數出這一點,但不能做到這一點。我怎樣才能做一個通用的函數,將採取一個具體的T,並使其爲可空(T)?

回答

10

這裏有一個相同的問題(在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

這太糟糕了,沒有一個Convert.TryChangeType方法,這將避免在輸入字符串無效時不得不吃掉異常。 – jjxtra 2009-06-19 19:39:54

3

如何:

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 

(注意我用反射鏡把這種從下面的C#)

你可以添加圍繞ConvertFromInvariantString的try/catch,但說實話,我寧願讓代碼拋出一個異常,如果我給它一些stoopid - 留空值爲空案件。

這樣做的好處是它可以與自己的結構一起工作,只要您將類型轉換器與它們關聯起來,您可以輕鬆地(使用屬性或在運行時)輕鬆完成。

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