用泛型包装重载函数

本文关键字:函数 重载 包装 泛型 | 更新日期: 2023-09-27 18:10:11

我想用一些额外的功能包装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>编写一个扩展方法:

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);
    }
}

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

您可以使用dynamic:

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

这将把重载解析推迟到运行时。当然,这也推动了类型检查,所以如果value使用了无效的类型,你会得到一个运行时异常,而不是编译器错误。

可以使用动态类型

阅读MSDN的链接