Как обойти проблему типа __Canon в универсальных обработчиках исключений? - PullRequest
1 голос
/ 11 апреля 2009

Учитывая метод расширения, подобный этому:

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

и тип MyCollection, который наследуется от ObservableCollection (Of V), мы обнаруживаем, что вызов someString.RehydrateTo (instanceOfMyCollection) может завершиться ошибкой в ​​обработчике исключений. Проблема в том, что GetType (T) не всегда оценивается как «MyCollection» - в то время как в обработчике исключений он оценивается как «__Canon».

(Система. _ Canon - это своего рода волшебство CLR, которое означает каноническое создание универсального)

Как мы можем обойти это?

1 Ответ

1 голос
/ 11 апреля 2009

Странное поведение 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 в блоке с общим кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...