给定一个如下的扩展方法:
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以及从someString.RehydrateTo(instanceOfMyCollection) (Of V)继承的MyCollection类型,我们发现调用ObservableCollection可能会在异常处理程序中失败。问题是GetType(T)并不总是求值为"MyCollection“--而在异常处理程序中,它求值为"__Canon”。
( System.__Canon是某种CLR魔术,意味着泛型的规范实例化)
我们该如何解决这个问题呢?
发布于 2009-04-10 21:24:22
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。
https://stackoverflow.com/questions/738911
复制相似问题