2011-02-16 153 views
0

我可以create classes that use generics,但我想知道是否有可能将此应用于共享方法而不是依赖调用者转换为正确的类型。是否可以使共享函数具有通用性?

这是方法:

Public Shared Function DeserializeObject(ByVal serializedXml As String, ByVal givenType As System.Type) As Object 
    Dim serializer As New XmlSerializer(givenType) 
    Return serializer.Deserialize(New IO.StringReader(serializedXml)) 
End Function 

我敢肯定,这不能做,但认为我会检查(如果有加分将被授予如果有人能在技术上解释为什么编译器不能做到这一点)..替代建议也将不胜感激。

回答

3
Public Shared Function StronglyTypedDeserializeObject(Of T) 
     (ByVal serializedXml As String) As T 

    Dim serializer As New XmlSerializer(GetType(T)) 

    Return DirectCast(
       serializer.Deserialize(New IO.StringReader(serializedXml)) 
       , T) 

End Function 

注意,调用将必须提供所期望的类型:

Dim foo As MyType 
    = Utility.StronglyTypedDeserializeObject(Of MyType)(sourceXml) 
3

没有理由不能创建函数的通用版本。例如: -

Public Shared Function Deserialize(Of T)(ByVal serializedXml As String) As T 
    Dim serializer As New XmlSerializer(GetType(T)) 
    Return DirectCast(serializer.Deserialize(New StringReader(serializedXml)), T) 
End Function 
-1

下面的例子演示了如何做到这一点。该esstential诀窍是要记住,你可以可以使用的GetType函数定义的通用例如的GetType(为MyObject(中T))

Public Class Form1 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim Test1 As New MyObject(Of String) 
     Dim Test2 As New MyObject(Of Integer) 
     Dim Data As String = "" 
     Test1.Data = "Hello World" 
     Test2.Data = 1010101 

     Data = Test1.SerializeObject 
     Test1 = MyObject(Of String).DeserializeObject(Data) 
     Debug.Print(Test1.Data) 

     Data = Test2.SerializeObject 
     Test2 = MyObject(Of Integer).DeserializeObject(Data) 
     Debug.Print(Test2.Data) 
    End Sub 

End Class 

Public Class MyObject(Of T) 
    Public Data As T 

    Public Sub New() 
    End Sub 

    Public Shared Function DeserializeObject(ByVal serializedXml As String) As MyObject(Of T) 
     Dim serializer As New XmlSerializer(GetType(MyObject(Of T))) 
     Return serializer.Deserialize(New IO.StringReader(serializedXml)) 
    End Function 

    Public Function SerializeObject() As String 
     Dim serializer As New XmlSerializer(GetType(MyObject(Of T))) 
     Dim Result As New IO.StringWriter() 
     serializer.Serialize(Result, Me) 
     Return Result.ToString 
    End Function 
End Class 

如果你不喜欢完全限定的类型在共享成员得到再你可以做这样的事情。

Public Class MyObjectString 
    Inherits MyObject(Of String) 
End Class 

然后就可以调用MyObjectString.Deserialize

+0

对不起,我想这对于共享的方法没有一个类的实例。您是否测试过这段代码,因为您无法调用共享方法并从中引用了一个成员变量var。 – 2011-02-16 15:06:47

相关问题