2009-04-10 6 views
1

eine Erweiterung Methode wie folgt gegeben:Wie kann ich das __Canon-Problem in generischen Exception-Handlern umgehen?

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 

und eine Art MyCollection, die von ObservableCollection (Of V) erbt, finden wir, dass Aufruf someString.RehydrateTo (instanceOfMyCollection) in dem Exception-Handler fehlschlagen kann. Das Problem besteht darin, dass GetType (T) nicht immer "MyCollection" auswertet, während es im Ausnahmehandler "__Canon" ergibt.

(System .__ Canon eine Art CLR Magie ist, die eine kanonische Instanziierung einer generischen Mittel)

Wie können wir dieses Problem umgehen?

+0

Ich bin ein bisschen angekreuzt, dass das unten geändert wurde. Habe ich hier etwas falsch gemacht? –

+0

weiß ich nicht, aber ich habe Sie gebeten, es wieder zu holen. Wahrscheinlich jemand mit der Nase aus dem einen oder anderen Grund. Ich habe jemanden, der meine Fragen/Antworten zwei Mal am Tag, zweimal am Tag ohne Zweifel ablehnt. Sie machen es seit fast einer Woche und jeden zweiten Tag werden die Downvotes von SOs "Missbrauchsdetektor-Ding" ausgelöscht. Nervig und gleichzeitig amüsant – Rob

Antwort

1

Das seltsame Verhalten von T ist nur im Exception-Handler, so können Sie einfach den Code aus dem Handler bewegen, wie folgt aus:

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 

Das Problem ist, dass die Exception-Handler ist „Code geteilt“ über mehrere Arten. Wenn wir uns im Exception-Handler befinden, sind wir für eine Klasse, die wir geschrieben haben, nicht code-spezifisch. Wir befinden uns in der kanonischen Instantiierung eines Generikums - deshalb T = System .__ Canon.

Die Problemumgehung besteht nur darin, T nicht in einem Code-Shared-Block auszuwerten.

Verwandte Themen