Как привести всё к базовому типу
Не могу понять как правильно реализовать метод DataToBytes.
Есть базовый абстрактный класс Data<T> и два наследника: DataSting (от Data<string>) и DataInt (от Data<int>).
Мне нужна функция, которая принимает любые классы, унаследованные от Data. Код:
using System;
using System.Collections.Generic;
using System.Text;
public class Program
{
public abstract class Data<T>
{
public T Value {get; set;}
public abstract byte[] ToBytes();
}
public sealed class DataInt : Data<int>
{
public override byte[] ToBytes()
{
return new byte[0]; // представим, что здесь какае-то логика
}
}
public sealed class DataString : Data<string>
{
public override byte[] ToBytes()
{
return new byte[0]; // представим, что здесь тоже какае-то логика
}
}
public static byte[] DataToBytes<T>(params Data<T>[] data)
{
var bytes = new List<byte>();
foreach (var dataObject in data)
bytes.AddRange(dataObject.ToBytes());
return bytes.ToArray();
}
public static void Main()
{
var intData = new DataInt() { Value = 1 };
var stringData = new DataString() { Value = "abc" };
var bytes = DataToBytes(intData, stringData); // ошибка компиляции
}
}
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Думаю, можно добавить интерфейс
public class Program
{
public interface IData
{
public byte[] ToBytes();
}
public abstract class Data<T> : IData
{
public T Value { get; set; }
public abstract byte[] ToBytes();
}
//...
public static byte[] DataToBytes<T>(params IData[] data)
{
using var ms = new MemoryStream();
foreach (IData dataObject in data)
ms.Write(dataObject.ToBytes());
return ms.ToArray();
}
//...
}
Да, кстати, MemoryStream здесь пошустрее отработает, чем List.