C# 轻松地将BitConverter.GetBytes上存在的所有重载用于我自己的方法
在我的程序中,我有一个C# 轻松地将BitConverter.GetBytes上存在的所有重载用于我自己的方法,c#,bitconverter,C#,Bitconverter,在我的程序中,我有一个PacketFactory,它构建缓冲区,准备通过网络流发送。正如您在下面所看到的,此方法采用short作为参数。此短消息传递给位转换器.GetBytes internal static class PacketFactory { internal static byte[] ToBuffer(PacketType type, short value) { byte[] packet = PacketTypeFactory.ToBuffer(
PacketFactory
,它构建缓冲区,准备通过网络流发送。正如您在下面所看到的,此方法采用short作为参数。此短消息传递给位转换器.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;
}
}
现在我的问题是:位转换器。GetBytes
有10个重载。我想在ToBuffer
方法中轻松地为我的value
参数使用所有这些重载
简单解决方案:创建同样存在于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));
}
}
使用接受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;
}
这样,BitConverter.GetBytes的正确重载将传递给ToBuffer
,我认为这会使api更难使用。我最好创建10个重载,而不是强制api用户每次都传递BitConverter.GetBytes.Thx。这将很好地工作,但我总是需要传递BitConverter.GetBytes
。如果我可以在最后移动Func并使用BitConverter.GetBytes作为默认值,那也没关系,因为默认参数必须是compiletime常量。这是我能想到的最优雅的解决方案。编译器必须知道BitConverter.GetBytes的重载,因此必须在值的范围内使用它。
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)