2017-03-11 15 views
2

私のプログラムでは、NetworkStream以上のバッファを準備するPacketFactoryが用意されています。以下に見られるように、このメソッドはパラメータとして短い値をとります。この短絡はBitConverter.GetBytesに渡されます。自分自身の方法でBitConverter.GetBytesに存在するすべてのオーバーロードを簡単に使用する

internal static class PacketFactory 
{ 
    internal static byte[] ToBuffer(PacketType type, short value) 
    { 
     byte[] packet = PacketTypeFactory.ToBuffer(type); 
     byte[] valueBytes = BitConverter.GetBytes(value); 

     byte[] buffer = new byte[packet.Length + valueBytes.Length]; 

     Array.Copy(packet, 0, buffer, 0, packet.Length); 
     Array.Copy(valueBytes, 0, buffer, packet.Length, valueBytes.Length); 

     return buffer; 
    } 
} 

今私の問題:BitConverter.GetBytesは10のオーバーロードがあります。 ToBufferメソッドのvalueパラメータで、このオーバーロードをすべて簡単に使用したいと思います。

ナイーブソリューション:BitConverter.GetBytes上に存在するすべてのオーバーロードを作成し、内部メソッドにすべてを渡します。これを解決するより良い方法はありますか?

​​3210

答えて

2

Funcを受け入れる一般的な方法で使用します。

internal static byte[] ToBuffer<T>(SocketType type, Func<T, byte[]> getBytes, T value) 
{ 
    byte[] packet = PacketTypeFactory.ToBuffer(type); 
    byte[] valueBytes = getBytes(value); 

    byte[] buffer = new byte[packet.Length + valueBytes.Length]; 

    Array.Copy(packet, 0, buffer, 0, packet.Length); 
    Array.Copy(valueBytes, 0, buffer, packet.Length, valueBytes.Length); 

    return buffer; 
} 

をそして、そのようにそれを呼び出す:

short shortValue = 5; 
PacketFactory.ToBuffer(SocketType.Raw, BitConverter.GetBytes, shortValue); 
// BitConverter.GetBytes(short) 

int intValue = 10; 
PacketFactory.ToBuffer(SocketType.Raw, BitConverter.GetBytes, intValue); 
// BitConverter.GetBytes(int) 

この方法は、BitConverter.GetBytesの正しい過負荷がToBufferに渡されます。

+1

私はAPIを使いにくくすると言いたいと思います。私は、毎回BitConverter.GetBytesを渡すためにapiのユーザーを強制するよりも、10個のオーバーロードを作成する方が良いでしょう。 – Evk

+1

Thx。これは正常に動作しますが、私は常に 'BitConverter.GetBytes'を渡す必要があります。 Funcを最後に移動してBitConverter.GetBytesをデフォルト値として使用することはできますが、デフォルトのパラメータはコンパイル時の定数でなければならないため動作しません。 –

+0

これは私が考えることができる最もエレガントなソリューションです。コンパイラは 'BitConverter.GetBytes'のオーバーロードを知っていなければならないので、値のスコープ内で使用する必要があります。 –

関連する問題