【问题标题】:Return a value from function of the type of a generic function从泛型函数类型的函数返回值
【发布时间】:2014-02-28 15:21:54
【问题描述】:

我无法返回“T”类型的值。展示比解释容易,方法如下:

Protected Function GetElementValue(Of T)(ByVal nodeName As String, Optional missingIfNotExists As Boolean = True,
                                                        Optional missingIfEmpty As Boolean = True,
                                                        Optional ByRef defaultVal As T = Nothing,
                                                        Optional maxLength As Integer = Nothing) As T

    'Set up the node to get the value from
    Dim node = xmlRoot.SelectSingleNode(nodeName)

    Select Case True

        Case IsNothing(node)                'If the node is missing from the xml document

            'Add the node to the misssing elements array if missingIfNotExists = True
            If missingIfNotExists Then missingElements.Add(nodeName)

            'Return the default value
            Return defaultVal

        Case node.InnerText.Trim.Length = 0 'The node exists in the xml document but has no value

            'Add it to missing elements if missingIfEmpty = True
            If missingIfEmpty Then missingElements.Add(nodeName)

            'If there is a default value passed in, return that value
            Return defaultVal

        Case Else                           'The node exists and contains data

    End Select

    'The element exists and contains data
    Dim nodeValue = node.InnerText.Trim

    'If a size constraint was passed in, ensure the element data is not too long. Shorten the string if it is
    If Not IsNothing(maxLength) AndAlso nodeValue.Length > maxLength Then nodeValue = nodeValue.Substring(0, maxLength)

    Return CType(nodeValue, T)

End Function

有什么想法或建议吗?

谢谢。

最后一次返回是我遇到问题的地方。它说“nodeValue 不能转换为 T 类型”

我尝试了以下场景,但出现错误:“整数类型的值不能转换为 T 类型”:

Select Case defaultVal.GetType()
    Case GetType(Integer)
        Return CType(nodeValue, Integer)
End Select

【问题讨论】:

    标签: vb.net function parameters type-conversion


    【解决方案1】:

    如果你之前将值存储为对象,它可以工作:

    Sub Main()
        Dim myInt = Foo(Of Integer)("123")
    End Sub
    
    Function Foo(Of T)(input As String) As T
        Dim bar As Object = input
        Return CType(bar, T)
    End Function
    

    【讨论】:

      猜你喜欢
      • 2020-10-26
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多