代码之家  ›  专栏  ›  技术社区  ›  Jeff Paulsen

如何解决一般异常处理程序中的\ canon类型问题?

  •  1
  • Jeff Paulsen  · 技术社区  · 16 年前

    给出如下扩展方法:

    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(属于V)继承的类型myCollection,我们发现在异常处理程序中调用someString.Rehydrateto(InstanceOfmyCollection)可能会失败。问题是getType(t)并不总是计算为“myCollection”,而在异常处理程序中,它的计算结果为“uCanon”。

    (System.uuCanon是某种clr魔力,意味着泛型的规范化实例化)

    我们如何解决这个问题?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Jeff Paulsen    15 年前

    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.\uCanon。

    解决方法只是在代码共享块中不计算t。