如何得到正确的T型

时间:2013-08-29 09:19:02

标签: vb.net reflection

我有一些像这样的代码:

    Private Shared Function ReStoreFromXML(Of T)(ByVal TargetType As T, ByVal XMLpath As String) As List(Of T)

        If Not TypeSupported(TargetType) Then Return Nothing
....
        Return CType(mySerializer.Deserialize(fstream), List(Of T))

TargetType例如是MyCustomType。

TypeSupported应检查TargetType是否正常。当我尝试像

这样的东西时
TargetType.GetType 

GetType(T)

我只获得System.RuntimeType或System.Type。我该如何解决这个问题?

UPD:

为了更清楚地理解我想要的东西......同样在方法ReStoreFromXML中我有这样的代码:

 Dim mySerializer As XmlSerializer
 mySerializer = New XmlSerializer(GetType(T)) 

如何使用参数MyCustomType创建mySerializer?

2 个答案:

答案 0 :(得分:3)

  

我以这样的方式调用我的函数viewsList = ReStoreFromXML(GetType(MyCustomType),XMLpath)

那是你的问题。如果您致电ReStoreFromXML(GetType(string), ...),则T将为Type / RuntimeType。如果您致电ReStoreFromXML("somestring", ...)T将为string

所以只需删除第一个参数,因为您已经通过调用GetType(T)知道了类型,因此没有必要。

Private Shared Function ReStoreFromXML(Of T)(XMLpath As String) As List(Of T)
    Dim mySerializer = New XmlSerializer(GetType(T)) 
    ...
End Function

ReStoreFromXML(Of MyCustomType)(XMLpath)

答案 1 :(得分:1)

类型应该是函数的类型参数,而不是该类型的参数。 (是的,这令人困惑)。

这样你就可以说明两次类型了,所以合理的调用将是:

ReStoreFromXML(Of String)("somestring", xmlPath)

“somestring”仅用于检查它确实是一个字符串,并且已在(Of String)部分中说明。

您应该将方法的签名更改为:

Private Shared Function ReStoreFromXML(Of T)(ByVal XMLpath As String) As List(Of T)
    If Not TypeSupported(T) Then Return Nothing
    ...
End Function