用泛型包装重载函数
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
我想用一些额外的功能包装 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