首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决泛型异常处理程序中的__Canon类型问题?

如何解决泛型异常处理程序中的__Canon类型问题?
EN

Stack Overflow用户
提问于 2009-04-10 21:22:29
回答 1查看 222关注 0票数 1

给定一个如下的扩展方法:

代码语言:javascript
复制
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魔术,意味着泛型的规范实例化)

我们该如何解决这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-04-10 21:24:22

T的奇怪行为只存在于异常处理程序中,所以您可以将代码移出处理程序,如下所示:

代码语言:javascript
复制
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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/738911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档