2009-06-19 18 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 

मैं इस से बाहर एक सामान्य समारोह बनाने की कोशिश कर रहा था, लेकिन नहीं कर सका कर दो। मैं एक सामान्य कार्य कैसे कर सकता हूं जो एक विशिष्ट टी लेगा और इसे एक शून्य (टी का) बना देगा?

उत्तर

10

एक समान प्रश्न (सी # में) यहाँ नहीं है: 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

यह बहुत बुरा है कि कनवर्ट नहीं है। TryChangeType विधि, जो इनपुट स्ट्रिंग मान्य होने पर अपवाद खाने से बचती है। – jjxtra

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 

(ध्यान दें मैं अनुवाद करने के लिए कि से नीचे सी # परावर्तक प्रयुक्त)

आप ConvertFromInvariantString के आस-पास कोशिश/पकड़ जोड़ सकता है, लेकिन ईमानदार होने के लिए, अगर मैं इसे कुछ stoopid देता हूं तो कोड को अपवाद फेंकना होगा - रिक्त स्थान के लिए नल छोड़ दें मामला।

इसका लाभ यह है कि यह आपके स्वयं के structs के साथ काम करता है, जब तक आप उनके साथ एक प्रकार-कनवर्टर संबद्ध करते हैं, जिसे आप आसानी से कर सकते हैं (एक विशेषता या रनटाइम के साथ)।

public static T? Parse<T>(string value) where T : struct 
{ 
    if (string.IsNullOrEmpty(value)) return null; 
    return (T)TypeDescriptor.GetConverter(typeof(T)) 
     .ConvertFromInvariantString(value); 
} 
संबंधित मुद्दे