用泛型包装重载函数

wrap overloading function with generics

我想用一些额外的功能包装 BitConverter。但是我不必像

这样写出所有的重载函数
BitConverter.GetBytes(int);
BitConverter.GetBytes(double);
...

有没有办法编写一个封装所有重载函数的模板函数?喜欢

void GetBytes <T> (List<byte> byteList, T value) 
{
    ....
    byte[] result = BitConverter.GetBytes(value);
    byteList.AddRange(result);
    return;
}

你可以为 IEnumerable<byte> 写一个 extension method 我想:

class Program
{
    static void Main(string[] args)
    {
        var target = new List<byte>();
        BitConverter.GetBytes(10).AddBytesToTarget(target);
        BitConverter.GetBytes(100d).AddBytesToTarget(target);
    }
}

static public class Extensions
{
    public static void AddBytesToTarget(this IEnumerable<byte> bytes, List<byte> target)
    {
        target.AddRange(bytes);
    }
}

你不能用泛型来做,因为重载解析 BitConverter.GetBytes 会失败,因为 T 可以是任何类型。

你可以用 dynamic:

void GetBytes(List<byte> byteList, dynamic value) {
    ....
    byte[] result = BitConverter.GetBytes(value);
    byteList.AddRange(result);
}

这会将重载决议推迟到运行时。当然,这也会推动类型检查,因此如果将无效类型用于值,您将得到运行时异常而不是编译器错误。

你可以使用动态类型

阅读这篇 link,共 MSDN