Легко использовать все перегрузки, которые существуют на BitConverter.GetBytes для моего собственного метода

В моей программе у меня есть PacketFactory который строит буферы, готовые к отправке через NetworkStream, Как вы можете видеть ниже, этот метод принимает короткое значение в качестве параметра. Этот короткий передается 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 перегрузок. Я хочу легко использовать все эти перегрузки для моего value параметр в ToBuffer метод.

Наивное решение: создайте все перегрузки, которые также существуют на BitConverter.GetBytes и передать все внутреннему методу. Есть ли лучший способ решить это?

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

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

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

        return buffer;
    }

    internal static byte[] ToBuffer(PacketType type, short value)
    {
        return ToBuffer(type, BitConverter.GetBytes(value));
    }
    internal static byte[] ToBuffer(PacketType type, int value)
    {
        return ToBuffer(type, BitConverter.GetBytes(value));
    }
}

1 ответ

Используйте универсальный метод, который принимает 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,

Другие вопросы по тегам