微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

vb.net – Typecasting通用参数

使用以下代码
Function GetSetting(Of T)(ByVal SettingName As String,ByRef DefaultVal As T) As T
    Return If(Configuration.ContainsKey(SettingName),CType(Configuration(SettingName),T),DefaultVal)
End Function

产生以下错误

Value of type 'String' cannot be converted to 'T'.

无论如何,我可以指定在所有情况下,转换确实是可能的(我基本上得到整数,布尔值,双精度和字符串).

编辑:现在似乎有三种解决方案:

>使用AMissico提供的`ValueAs`功能
>转换为`object`,然后转换为`T`,并检查空值
>在Convert.ChangeType上使用`DirectCast`

你会建议哪个?

编辑2:
这段代码有用吗?

Function GetSetting(Of T)(ByVal SettingName As String,Optional ByRef DefaultVal As T = nothing) As T
    Return If(Configuration.ContainsKey(SettingName),ConvertTo(Of T)(Configuration(SettingName)),DefaultVal)
End Function

Function ConvertTo(Of T)(ByVal Str As String) As T
    Return If(Str Is nothing Or Str = "",nothing,CType(CObj(Str),T))
End Function

编辑3:[AMJ]工作代码

Function GetSetting(Of T)(ByVal SettingName As String) As T
    Return GetSetting(Of T)(SettingName,nothing)
End Function
Function GetSetting(Of T)(ByVal SettingName As String,ByVal DefaultVal As T) As T
    Dim sValue As String = Configuration(SettingName)
    If Len(sValue) = 0 Then
        Return DefaultVal
    Else
        Return CType(CObj(sValue),T)
    End If
End Function

快速测试方法

Public Sub DoIt()

    Me.Configuration.Add("KeyN",nothing)
    Me.Configuration.Add("KeyE",String.Empty) '""
    Me.Configuration.Add("Key1","99")
    Me.Configuration.Add("Key2","1/1/2000")
    Me.Configuration.Add("Key3","True")
    Me.Configuration.Add("Key4","0")

    Dim o As Object 'using object in order to see what type is returned by methods

    o = Value(Of Integer)("KeyN",10) '10
    o = Value(Of Integer)("KeyE",10) '10
    o = Value(Of Integer)("Key1",10) '99

    o = Value(Of Date)("KeyN",#11/11/2010#)
    o = Value(Of Date)("KeyE",#11/11/2010#)
    o = Value(Of Date)("Key2",#11/11/2010#)

    o = GetSetting(Of Integer)("KeyN",10) '10
    o = GetSetting(Of Integer)("KeyE",10) '10
    o = GetSetting(Of Integer)("Key1",10) '99

    o = GetSetting(Of Date)("KeyN",#11/11/2010#)
    o = GetSetting(Of Date)("KeyE",#11/11/2010#)
    o = GetSetting(Of Date)("Key2",#11/11/2010#)

    Stop
End Sub
Value(Of T)和ValueAs方法支持可空类型.我使用Microsoft .NET 2.0源代码作为参考.

这是经过充分测试和生产就绪的代码.

这些“库”函数中没有错误处理.调用者有责任处理发生的任何转换错误.生成的唯一转换错误是明显的错误,例如尝试将字符串“abc”转换为Integer.

Public Sub DoIt()
    Dim o As Object
    o = Value(Of Integer)("foo",10)
    o = Value(Of DateTime)("xxx",#1/1/2000#)
    o = Value(Of Boolean?)("nop",True)
    Stop
End Sub

Public Function GatherTag(ByVal tag As String) As String
    If tag = "foo" Then
        Return "99"
    Else
        Return String.Empty
    End If
End Function

''' <summary>
''' Provides strongly-typed access to the tag values. The method also supports nullable types.
''' </summary>
''' <typeparam name="T">A generic parameter that specifies the return type.</typeparam>
''' <param name="tag">The ExifTool Tag Name,</param>
''' <returns>The value,of type T,of the tag.</returns>
Public Function Value(Of T)(ByVal tag As String,ByVal defaultValue As T) As T
    Return DirectCast(ValueAs(GetType(T),tag,defaultValue),T)
End Function

''' <summary>
''' Returns the tag's value as the specified type. The method also supports nullable types.
''' </summary>
''' <param name="type">The type to return the tag value as.</param>
''' <param name="tag">The ExifTool Tag Name,</param>
''' <returns>The value of the tag as the type requested.</returns>
Public Function ValueAs(ByVal type As System.Type,ByVal tag As String,ByVal defaultValue As Object) As Object
    Dim oResult As Object = nothing

    Dim oTag As String = GatherTag(tag)

    If Len(oTag) = 0 Then

        'use specified default value

        oResult = defaultValue

    Else

        'is requested type a generic type?

        If type.IsGenericType AndAlso type.GetGenericTypeDeFinition Is GetType(Nullable(Of )) Then

            Dim oUnderlyingType As Type = Nullable.GetUnderlyingType(type)

            Dim oConstructed As Type = type.GetGenericTypeDeFinition.MakeGenericType(oUnderlyingType)

            Dim ovalue As Object

            ovalue = System.Convert.ChangeType(oTag,oUnderlyingType)

            If ovalue IsNot nothing Then
                oResult = Activator.CreateInstance(oConstructed,ovalue)
            End If

        Else

            'non-generic type

            oResult = System.Convert.ChangeType(oTag,type)

        End If

    End If

    Return oResult
End Function

原文地址:https://www.jb51.cc/vb/255480.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐