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]);
コードが少し増えますが、コンパイル時の型の安全性と速度が大幅に向上します。