Способы конкретизации типа в generic классах

136
21 ноября 2019, 11:00

Есть класс

public class Param<T>
{
    public T Value { get; protected set; }
    public byte[] GetBytes()
    {
        // ...
    }
    public static T GetInstance(byte[] bytes)
    {
        // ...
    }
}

Он инкапсулирует значение параметра (параметр может быть любого значимого типа, но реально будет uint, float и double). В методе GetBytes нужно сделать как-то так:

public byte[] GetBytes()
{
    return BitConverter.GetBytes(Value);
}

Аналогично нужно сделать и в методе GetInstance. Понятно, что компилятор такое не пропустит, потому что он пока ничего не знает о типе T. Вот, как я планирую решить эту проблему:

public byte[] GetBytes()
{
    switch (Value)
    {
        case uint ui:
            return BitConverter.GetBytes(ui);
        case float f:
            return BitConverter.GetBytes(f);
        case double d:
            return BitConverter.GetBytes(d);
        default:
            throw new Exception();
    }            
}

Но эта фича доступна только начиная с C# 7.1. Как можно по-другому обходить все возможные варианты типа? Какой вариант наиболее предпочтителен? Во что разворачивается этот новомодный switch-case?

READ ALSO
Совмещение дерева и таблицы

Совмещение дерева и таблицы

Есть дерево TreeViewМожно ли к нему добавить таблицу из 1-го столбика? Должно выглядеть примерно как редактирование свойств элемента

114
Сравнение лиц по фотографии

Сравнение лиц по фотографии

есть идея реализации системы распознания лиц, после чего нужно будет сравнивать с уже имеющимися фотографиямиТ

110
Как получить верхнее модальное окно в WinForms?

Как получить верхнее модальное окно в WinForms?

Для программы пишется плагин с использованием WinForms

140