给出这样的扩展方法:
Public Sub RehydrateTo(Of T As New)(ByVal input As String, ByRef output As T)
Dim ms As MemoryStream = MsFromString(input)
Dim f As New DataContractSerializer(GetType(T))
Try
output = CType(f.ReadObject(ms), T)
Catch ex As SerializationException
output = New T
Dim ild As ILegacyDeserializer = TryCast(output, ILegacyDeserializer)
If Not ild Is Nothing Then
' ... you get the idea
End If
End Try
End Sub
和一个继承自ObservableCollection(Of V)的MyCollection类型,我们发现调用someString.RehydrateTo(instanceOfMyCollection)可能会在异常处理程序中失败。问题是GetType(T)并不总是评估为“MyCollection” - 而在异常处理程序中,它的计算结果为“__Canon”。
(System .__ Canon是某种CLR魔法,意味着通用的规范实例化)
我们如何解决这个问题?
答案 0 :(得分:1)
T的奇怪行为只在异常处理程序中,所以你可以将代码移出处理程序,如下所示:
Dim exceptionCaught As Boolean
Try
output = CType(f.ReadObject(ms), T)
Catch ex As SerializationException
exceptionCaught = True
End Try
If Not exceptionCaught Then
Exit Sub
End If
'here we put the code that we want to handle the exception
问题是异常处理程序是跨多种类型的“代码共享”。当我们在异常处理程序中时,我们不是特定于我们编写的任何类的代码,我们处于泛型的规范实例化中 - 这就是为什么T = System .__ Canon。
解决方法是在代码共享块中不评估T.