2009-06-23 17 views
1

Ich bin sicher, das ist eine einfache Frage, aber ich habe keine Antwort für. Hier ist das Senario und die Frage.Wie bekomme ich die Länge eines TypeCode

Ich habe ein Array, das in einem bestimmten Format gespeichert wurde. Das Format enthält einen Header-Datensatz mit nachfolgenden Detailsätzen. Der Header des Datensatzes sagt mir, welcher TypeCode zum Speichern der Daten verwendet wurde, zum Beispiel Int32.

Ich habe eine Routine, die ein byte [] -Array nimmt und konvertiert die Byte-Daten zurück in das richtige Format in C#. Diese Routine benötigt die richtige Anzahl von Bytes, um die Konvertierung erfolgreich durchzuführen.

Frage: Also, wie kann ich die Länge von Bytes aus dem angegebenen TypeCode für die Übergabe an die Convert-Funktion erhalten, ohne die Länge für jeden Typ fest codieren zu müssen?

Antwort

3

Vorausgesetzt, dass TypeCode nur eine Aufzählung einer festen Reihe von Werten ist, könnten Sie leicht ein Wörterbuch von ihnen fest codieren, z.

private static readonly Dictionary<TypeCode,int> TypeCodeLength = 
    new Dictionary<TypeCode,int> { 
    { TypeCode.Int32, 4 }, 
    { TypeCode.Int64, 8 }, 
    { TypeCode.Char, 2 }, 
    // etc 
} 

(Eine äquivalente Lösung wäre, einen Switch/Case-Anweisung zu verwenden - sie wirklich gleichwertig sind, wenn Sie nur Werte einschließlich.)

Einige, wie string und object wird jedoch variabel sein - und Andere hängen davon ab, wie Sie Dinge wie DateTime kodieren.

Wenn dies keine Standardkonvertierung ist, kann nichts im Framework Ihnen die Längen geben. Ich weiß, dass Hard-Coding im Allgemeinen verpönt ist, aber in diesem Fall ist es nur an einer Stelle und wird die einfachste Option sein.

+0

Ich muss die Frage missverstanden haben. :) Für diese Implementierung scheint es, als könnten Sie ein Modell wie BSTR verwenden, bei dem die ersten vier Bytes des Arrays die Länge des Typs oder eine solche Konvention darstellen. –

+0

Natürlich, genau wie der Schalter, bricht dies, wenn ein neuer Typ eingeführt wird. –

+0

Die Einführung eines neuen Mitglieds in eine Enum ist * immer * eine brechende Änderung. Ich erwarte nicht, dass sich das TypeCode Enum in absehbarer Zeit ändert ... Microsoft wird wahrscheinlich nicht den Code jedes Entwicklers brechen wollen, der es einschaltet. –

Verwandte Themen