我不同意这dynamic
是最好的方法。这里的问题是你需要保证调用者传递一个T
可以BinaryWriter.Write()
处理的类型。由于没有通用类或接口可以通过约束来保证这一点T
,因此最好的方法是将责任“转嫁”给调用者,如下所示:
private static void WriteToDisk<T>(string fileName, T[] vector, Action<BinaryWriter, T> callWrite)
{
using (var stream = new FileStream(fileName, FileMode.Create))
{
using (var writer = new BinaryWriter(stream))
{
foreach (T v in vector)
callWrite(writer, v);
writer.Close();
}
}
}
这被称为如下:
WriteToDisk("filename", new int[0], (w, o) => w.Write(o)); // compiles
WriteToDisk("filename", new string[0], (w, o) => w.Write(o)); // compiles
WriteToDisk("filename", new DateTime[0], (w, o) => w.Write(o)); // doesn't compile (as desired)
当然,如果只有一小部分已知类型,您可以这样创建“便捷方法”:
private static void WriteToDisk(string fileName, int[] vector)
{
WriteToDisk(fileName, vector, (w, o) => w.Write(o));
}
private static void WriteToDisk(string fileName, string[] vector)
{
WriteToDisk(fileName, vector, (w, o) => w.Write(o));
}
现在你的电话很简单:
WriteToDisk("filename", new int[0]);
WriteToDisk("filename", new string[0]);
更多的代码,但更多的编译时类型安全和速度。