Легко использовать все перегрузки, которые существуют на 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
,