Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

C#. Тип объекта не известен во время компиляции. Какой механизм выбрать?

#c_sharp #динамическая_типизация


Описан класс Volume. Volume содержит атрибут в виде объекта. Этот объект может иметь
тип либо BootFAT16 либо BootFAT32 либо BootNTFS и до момента использования этого объекта,
какой тип присваивать, будет ясно из условия. И в дальнейшем, в зависимости от типа
объекта, он будет обрабатываться по-разному. (Интерфейс я использовать не могу т.к.
много методов имеют разную сигнатуру)
Как решаются такие ситуации? Какие механизмы применяют?
    


Ответы

Ответ 1



Думаю, что вариант со switch не очень удобный. Можно использовать словарь с делегатами. Так удобнее добавлять новые обработчики. public void ProcessBootCommon(object value) { var bootType = value.GetType(); //проверка на наличие нужного обработчика if (!BootProcessors.ContainsKey(bootType)) return; var processor = BootProcessors[bootType]; //вызов обработчика processor.Invoke(value); } private Dictionary> BootProcessors = new Dictionary> { { typeof(BootFat16), ProcessBootFat16} //и так далее для каждого типа. Легко добавлять новые обработчики, если вдруг появятся новые типы }; private void ProcessBootFat16(object value) { //Пост проверка. На всякий случай if(value.GetType() != typeof(BootFat16)) return; //Код обработки }

Ответ 2



В C# все типы наследуются от базового типа object, используйте его. Ваш код будет примерно такой (C#7): void UseVolume(object volume) { switch(volume) { case BootFat16 bootFat16: BootFat16VolumeProcessor.Process(bootFat16); break; case BootFat32 bootFat32: BootFat32VolumeProcessor.Process(bootFat32); break; case BootNtfs bootNtfs: BootNtfsVolumeProcessor.Process(bootNtfs); break; default: throw new InvalidOperationException("Unknown volume type"); } }

Комментариев нет:

Отправить комментарий