通过使用泛型变量作为参数来调用重载函数

时间:2012-08-18 02:56:16

标签: c# generics extension-methods type-constraints

我想扩展BinaryWriter类,以便能够将列表写入流中。 我想用多种类型的列表来做这件事。我将此通用函数设置为扩展

public static void Write<T>(this BinaryWriter source, IEnumerable<T>items)
{
     foreach (T item in items)
          source.Write(item)//This doesn't work
} 

这一切都可能吗?我知道write可以处理所有内置类型。我知道有能力将T约束到某些类型,但我无法为int和double执行此操作。

我只需要它就能用于整数,双精度和字节。

2 个答案:

答案 0 :(得分:5)

  

我知道有能力将T约束到某些类型

不幸的是,编译器不知道T是这些类型中的一种,所以它必须抱怨。

  

我只需要它就能用于整数,双精度和字节。

您可以进行三次重载:

public static void Write(this BinaryWriter source, IEnumerable<int>items) {
    foreach (var item in items)
        source.Write(item);
}
public static void Write(this BinaryWriter source, IEnumerable<double>items) {
    foreach (var item in items)
        source.Write(item);
}
public static void Write(this BinaryWriter source, IEnumerable<byte>items) {
    foreach (var item in items)
        source.Write(item);
}

答案 1 :(得分:2)

dasblinkenlight的解决方案可能是要走的路,但这里有另一种选择:

public static void Write(this BinaryWriter source, IEnumerable items)
{
     foreach (dynamic item in items)
          source.Write(item); //runtime overload resolution! It works!
}

有关dynamic的详情,请参阅the documentation