VB.NET, сделать функцию с типом возврата универсальным? - PullRequest
1 голос
/ 29 апреля 2010

В настоящее время я написал функцию для десериализации XML, как показано ниже. Как мне изменить его, чтобы мне не приходилось менять тип каждый раз, когда я хочу сериализовать другой тип объекта? Текущий тип объекта - cToolConfig. Как сделать эту функцию общей?

       Public Shared Function DeserializeFromXML(ByRef strFileNameAndPath As String) As XMLhandler.XMLserialization.cToolConfig
        Dim deserializer As New System.Xml.Serialization.XmlSerializer(GetType(cToolConfig))
        Dim srEncodingReader As IO.StreamReader = New IO.StreamReader(strFileNameAndPath, System.Text.Encoding.UTF8)
        Dim ThisFacility As cToolConfig

        ThisFacility = DirectCast(deserializer.Deserialize(srEncodingReader), cToolConfig)
        srEncodingReader.Close()
        srEncodingReader.Dispose()

        Return ThisFacility
    End Function


    Public Shared Function DeserializeFromXML1(ByRef strFileNameAndPath As String) As System.Collections.Generic.List(Of XMLhandler.XMLserialization.cToolConfig)
        Dim deserializer As New System.Xml.Serialization.XmlSerializer(GetType(System.Collections.Generic.List(Of cToolConfig)))
        Dim srEncodingReader As IO.StreamReader = New IO.StreamReader(strFileNameAndPath, System.Text.Encoding.UTF8)
        Dim FacilityList As System.Collections.Generic.List(Of cToolConfig)
        FacilityList = DirectCast(deserializer.Deserialize(srEncodingReader), System.Collections.Generic.List(Of cToolConfig))
        srEncodingReader.Close()
        srEncodingReader.Dispose()

        Return FacilityList
    End Function

1 Ответ

5 голосов
/ 29 апреля 2010

Это то, что вы имеете в виду?

Public Shared Function DeserializeFromXML(Of T)(ByRef strFileNameAndPath As String) As T
    Dim deserializer As New System.Xml.Serialization.XmlSerializer(GetType(T))
    Dim srEncodingReader As IO.StreamReader = New IO.StreamReader(strFileNameAndPath, System.Text.Encoding.UTF8)
    Dim ThisFacility As T

    ThisFacility = DirectCast(deserializer.Deserialize(srEncodingReader), T)
    srEncodingReader.Close()
    srEncodingReader.Dispose()

    Return ThisFacility
End Function


Public Shared Function DeserializeFromXML1(Of T)(ByRef strFileNameAndPath As String) As System.Collections.Generic.List(Of T)
    Dim deserializer As New System.Xml.Serialization.XmlSerializer(GetType(System.Collections.Generic.List(Of T)))
    Dim srEncodingReader As IO.StreamReader = New IO.StreamReader(strFileNameAndPath, System.Text.Encoding.UTF8)
    Dim FacilityList As System.Collections.Generic.List(Of T)
    FacilityList = DirectCast(deserializer.Deserialize(srEncodingReader), System.Collections.Generic.List(Of T))
    srEncodingReader.Close()
    srEncodingReader.Dispose()

    Return FacilityList
End Function

Обратите внимание, что вы можете наложить ограничения на T, такие как:

Public Shared Function DeserializeFromXML(Of T As Class)

И даже поставить несколько ограничений, таких как:

Public Shared Function DeserializeFromXML(Of T As {Class, New, IDisposable})
...