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)