Как привести всё к базовому типу

Не могу понять как правильно реализовать метод 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.

→ Ссылка