2015-04-15 1 views
1

Existe-t-il une façon plus simple de faire cela? Étant donné un flux d'octets pour le convertir au type de numéro désiré.Interrupteur C# sur le type variable

(Assumer le code d'appel sera en charge les types de données pertinentes au nombre d'octets dans le flux).

public void GetValue(byte[] bytes, ref UInt16 value) 
    { 
     if (BitConverter.IsLittleEndian) 
      Array.Reverse(bytes); 
     value = BitConverter.ToUInt16(bytes, 0); 
    } 
    public void GetValue(byte[] bytes, ref UInt32 value) 
    { 
     if (BitConverter.IsLittleEndian) 
      Array.Reverse(bytes); 
     value = BitConverter.ToUInt32(bytes, 0); 
    } 
    public void GetValue(byte[] bytes, ref UInt64 value) 
    { 
     if (BitConverter.IsLittleEndian) 
      Array.Reverse(bytes); 
     value = BitConverter.ToUInt64(bytes, 0); 
    } 
    etc... 

J'imagine qu'il ya une meilleure façon, en passant sur le type de valeur, par exemple, plutôt que d'avoir répliquées les surcharges.

+3

Je * * en faisant commencer les méthodes renvoient une valeur et se débarrasser du paramètre 'ref' ... puis nommer les méthodes' GetInt32' etc. En utilisant un paramètre 'ref' juste donc vous pouvez surcharger la méthode me semble assez horrible. –

+0

Oh, et vous pourriez vouloir regarder http://pobox.com/~skeet/csharp/miscutil qui inclut 'EndianBitConverter' ... –

Répondre

6

Eh bien, vous pouvez extraire les conditions du renversement du tableau, et je ne voudrais pas utiliser du tout les surcharges:

public ushort GetUInt16(byte[] bytes) 
{ 
    ReverseIfLittleEndian(bytes); 
    return BitConverter.ToUInt16(bytes, 0); 
} 

public uint GetUInt32(byte[] bytes) 
{ 
    ReverseIfLittleEndian(bytes); 
    return BitConverter.ToUInt32(bytes, 0); 
} 

public ulong GetUInt64(byte[] bytes) 
{ 
    ReverseIfLittleEndian(bytes); 
    return BitConverter.ToUInt64(bytes, 0); 
} 

private static void ReverseIfLittleEndian(byte[] bytes) 
{ 
    if (BitConverter.IsLittleEndian) 
    { 
     Array.Reverse(bytes); 
    } 
} 

Si vous visez vraiment avoir une seule méthode, j'éviter d'essayer d'obtenir "mignon" et coller avec "simple et lisible". Oui, vous vous retrouvez avec plusieurs méthodes similaires - mais chacune est simple à comprendre, simple à appeler et ne nécessite pratiquement aucune maintenance. Cela me semble bien ...