【问题标题】:Creating a generic method for converting string to nullable numbers创建将字符串转换为可空数字的通用方法
【发布时间】:2010-11-04 09:31:12
【问题描述】:

我有 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 并使其成为 Nullable(of T)?

【问题讨论】:

    标签: .net vb.net extension-methods


    【解决方案1】:

    这里有一个相同的问题(在 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
    

    【讨论】:

    • 可惜没有 Convert.TryChangeType 方法,这样可以避免在输入字符串无效时吃异常。
    【解决方案2】:

    怎么样:

    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,但老实说,如果我给它一些愚蠢的东西,我宁愿让代码抛出异常 - 为空白情况留空。

    这样做的好处是它可以与您自己的结构一起使用,只要您将类型转换器与它们关联起来,您就可以轻松地做到这一点(使用属性或在运行时)。

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

    【讨论】:

      猜你喜欢
      • 2012-07-13
      • 2012-02-04
      • 2020-08-16
      • 2014-03-05
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      相关资源
      最近更新 更多