2009-06-19 21 views
6

Tôi có 3 chức năng tương tự, mà chỉ thay đổi dựa trên kiểu số:Tạo một phương pháp chung để chuyển đổi chuỗi số 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 

Tôi đã cố gắng để thực hiện một chức năng chung ra điều này, nhưng không thể làm đi. Làm thế nào tôi có thể thực hiện một chức năng chung mà sẽ mất một T cụ thể và làm cho nó một Nullable (của T)?

Trả lời

10

Có một câu hỏi giống hệt nhau ở đây (trong 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

Quá xấu không có phương thức Convert.TryChangeType, điều đó sẽ tiết kiệm phải ăn ngoại lệ khi chuỗi đầu vào không hợp lệ. – jjxtra

3

Làm thế nào về:

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 

(lưu ý tôi đã sử dụng phản xạ để dịch mà từ C# bên dưới)

Bạn có thể thêm try/catch xung quanh ConvertFromInvariantString, nhưng thành thật mà nói tôi muốn có mã ném một ngoại lệ nếu tôi cho nó một cái gì đó stoopid - để trống cho trống trường hợp.

Lợi thế của việc này là nó hoạt động với cấu trúc của riêng bạn, miễn là bạn kết hợp bộ chuyển đổi kiểu với chúng, bạn có thể thực hiện dễ dàng (với thuộc tính hoặc thời gian chạy).

public static T? Parse<T>(string value) where T : struct 
{ 
    if (string.IsNullOrEmpty(value)) return null; 
    return (T)TypeDescriptor.GetConverter(typeof(T)) 
     .ConvertFromInvariantString(value); 
} 
Các vấn đề liên quan