Как использовать System.IO.BinaryWriter в С# с массивом шаблона/универсального типа?

Мне было интересно, есть ли способ использовать System.IO.BinaryWriter в C# для записи массива шаблонного/универсального типа?

Например, у меня есть буфер в шаблонной структуре:

T[] buffer

T обычно представляет собой bool или byte. Идея заключалась в том, чтобы иметь методы для записи каждого из этих типов, например:

public void WriteByte(System.IO.BinaryWriter writer, int sizeToWrite)
{
  if (typeof(T) != typeof(byte)) Error.Happened("Struct is not of type byte.");

  // Direct use does not work even when T is 'byte'
  writer.Write(buffer[i], 0, sizeToWrite);

  // Casting does not work
  writer.Write((byte[])buffer[i], 0, sizeToWrite);
}

Однако, похоже, нет никакого способа использовать шаблонный массив для записи.

Любые предложения будут очень приветствоваться!


person ares_games    schedule 23.10.2016    source источник


Ответы (2)


Я не совсем уверен, какова цель, но путь может быть таким:

public static void WriteByte<T>(T[] data, Converter<T, byte[]> converter, string path)
{
  using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
  {
    using (BinaryWriter writer = new BinaryWriter(stream))
    {
      foreach (var x in data)
      {
        var bytes = converter(x);
        foreach (var b in bytes)
        {
          writer.Write(b);
        }
      }
    }
  }
}

или проще

public static void WriteBytes<T>(T[] data, Converter<T, byte[]> converter, string path)
{
  using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
  {
    foreach (T x in data)
    {
      var buffer = converter(x);
      stream.Write(buffer, 0, buffer.Length);
    }
  }
}

прецедент:

static void Main(string[] args)
{
  byte[] data = { 1, 2, 3, 4, 5, 6, 7 };
  WriteByte(data, (b) => new byte[] { b }, @"C:\Temp\MyBinary1.myb");

  int[] intData = { 1, 2, 3, 4, 5, 6, 7 };
  WriteByte(intData, BitConverter.GetBytes, @"C:\Temp\MyBinary2.myb");

  long[] longData = { 1, 2, 3, 4, 5, 6, 7 };
  WriteByte(longData, BitConverter.GetBytes, @"C:\Temp\MyBinary3.myb");

  char[] charData = { '1', '2', '3', '4', '5', '6', '7' };
  WriteByte(charData, BitConverter.GetBytes, @"C:\Temp\MyBinary4.myb");

  string[] stringData = { "1", "2", "3", "4", "5", "6", "7" }; 
  WriteByte(stringData, Encoding.Unicode.GetBytes, "C:\Temp\MyBinary5.myb");


}

ИЗМЕНИТЬ:

Другой подход может быть таким:

    public static void WriteBytes3<T>(T[] data, Action<T> writer)
    {
      foreach (T x in data)
      {
        writer(x);
      }
    }

    static void Main(string[] args)
    {

      using (FileStream stream = new FileStream(@"C:\Temp\MyBinary6.myb", FileMode.Create, FileAccess.Write, FileShare.None))
      using (BinaryWriter writer = new BinaryWriter(stream))
      {
        WriteBytes3(intData, writer.Write);
      }
    }
person Community    schedule 23.10.2016

for(int i = 0; i < sizeToWrite; ++i)
{
    writer.Write((byte)buffer[i]);
}

Или более эффективным

writer.Write(Array.ConvertAll(buffer, b => (byte)b), 0, sizeToWrite);
person airafr    schedule 23.10.2016