如何在常规异常处理程序中解决__Canon类型问题?

时间:2009-04-10 21:22:29

标签: .net vb.net generics exception

给出这样的扩展方法:

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魔法,意味着通用的规范实例化)

我们如何解决这个问题?

1 个答案:

答案 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.