使用通用变量作为参数调用重载函数

3

我希望扩展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进行限制。

我只需要它适用于整数,双精度浮点数和字节。


如果它只应该适用于整数、双精度和字节,为什么不直接编写3个重载函数? - Chris Sinclair
基本上,目前它只需要处理那三种类型,但是未来的需求可能会扩展到能够处理其他类型。--编辑单词 - Bear
2个回答

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

谢谢,我想知道是否有一种方法可以使它更具动态性,因为将来我可能需要扩展其使用方式。这是我想出的解决方案,但我想知道如何让它更加DRY。谢谢。 - Bear
@Bear Tim的方法也是有效的,而且看起来非常酷。由于动态类型的原因,它可能会慢得多,但您可以将其用作捕获所有重载。 - Sergey Kalinichenko
是的,那就是我想的。我不在开发实时应用,所以运行时间成本没问题。(我已经使用了大量系统反射来使代码更易读。)它们都可以工作,我打算试试Tim的方法。你和我有相同的思路,但在三个不同的地方键入相同的代码感觉不太对。 - Bear

2

dasblinkenlight的解决方案可能是可行的,但这里提供另一种选择:

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

想了解更多有关 动态 的信息,请参阅文档


谢谢,我想我要尝试一下这个。到目前为止它工作得像我想要的那样。我知道它可能会有运行时错误,但我认为这正是我想要的。谢谢! - Bear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接