2009-04-10 5 views
1

Étant donnée une méthode d'extension comme ceci:Comment puis-je contourner le problème de type __Canon dans les gestionnaires d'exceptions génériques?

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 

et un MaCollection de type qui hérite de ObservableCollection (V), nous constatons que l'appel someString.RehydrateTo (instanceOfMyCollection) peut échouer dans le gestionnaire d'exception. Le problème est que GetType (T) n'évalue pas toujours à "MyCollection" - tandis que dans le gestionnaire d'exception, il évalue à "__Canon".

(System .__ Canon étant une sorte de magie CLR qui signifie une instanciation canonique d'un générique)

Comment pouvons-nous travailler autour de cela?

+0

Je suis un peu cochée que cela a été réduit. Ai-je fait quelque chose de mal ici? –

+0

ne sais pas, mais je vous ai attribué +1 pour le rétablir. Probablement quelqu'un avec le nez hors de la jointure pour une raison ou une autre. J'ai quelqu'un qui vote mes questions/réponses deux fois/trois fois par jour, deux fois par jour sans faute. Ils le font depuis près d'une semaine maintenant et tous les deux jours, les downvotes sont anéanties par SO "abus detector thingy". Agaçant, mais amusant en même temps – Rob

Répondre

1

Le comportement étrange de T est seulement dans le gestionnaire d'exceptions, de sorte que vous pouvez simplement déplacer le code de gestionnaire, comme ceci:

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 

Le problème est que le gestionnaire d'exceptions est « code partagé » à travers plusieurs types. quand nous sommes dans le gestionnaire d'exception, nous ne sommes pas en code spécifique à une classe que nous avons écrite, nous sommes dans l'instanciation canonique d'un générique - c'est pourquoi T = System .__ Canon.

La solution de contournement consiste simplement à ne pas évaluer T dans un bloc partagé par code.

Questions connexes