2015-04-15 4 views
1

Есть ли способ сделать это? Задайте поток байтов, чтобы преобразовать его в нужный тип.C# switch on variable type

(Предположим, что вызывающий код будет обрабатывать типы данных, относящиеся к числу байтов в потоке).

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... 

Я полагаю, что есть лучший способ, путь включения типа значения, например, вместо того, повторены перегрузки.

+3

Я бы * начал *, заставив методы вернуть значение и избавиться от параметра 'ref' ... затем называть методы' GetInt32' и т. Д. Используя параметр 'ref' просто поэтому вы можете перегрузить метод, который мне кажется ужасным. –

+0

О, и вы можете посмотреть http://pobox.com/~skeet/csharp/miscutil, который включает в себя «EndianBitConverter» ... –

ответ

6

Ну вы можете извлечь обусловленность разворота массива, и я бы не использовать перегруженные вообще:

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); 
    } 
} 

Если вы действительно стремится иметь один метод, я бы избежать попыток, чтобы получить «мило» и придерживаться «простых и понятных». Да, вы получаете несколько аналогичных методов, но каждый из них прост для понимания, простого вызова и в основном нулевого обслуживания. Звучит хорошо для меня ...