Словарь с разными типами значений

110
08 октября 2021, 19:30

В общем, предположим задача получать данные из разных типов файлов: txt,access и т д.

Для этого я хочу сделать интерфейс:

interface IDataExtracotr<TOut>{
    TOut GetData(string pathToFile)
}

Далее я хочу создать класс на каждый тип и реализовать данный интерфейс. Понятное дело, что при чтении txt-файлов будет возвращаться строка, а при чтении Access-файла DataTable.

Далее, я хотел бы это запихать в словарь, что бы ключом было расширение файла, а значением обработчик.

Так вот, это у меня сделать не получиться из-за разных возвращаемых типов...

Можно ли как-то элегантно решить задачу? Можно рефлексией проверять возвращаемый тип и делать приведение, но это попахивает большим свичем...

Answer 1

К сожалению, мне кажется, без свича точно определить возвращаемый тип нельзя.

Я не знаю, для каких целей вам нужна именно такая архитектура, но более-менее допустимыми решениями можно считать следующие:

  • Подумайте, нужно ли вам вообще возвращать какой-то тип. Если у вас подразумевается логика "пришёл неизвестный файл, я кладу его в ящик (интерфейс), а он уже сам знает что с ним делать", почему бы тогда и обработку полученных данных не делать в подобных DataExtractor'у классах, например IDataHandler, который использует IDataExtractor.
  • Можно возвращать вместо конкретного типа абстрактный тип (например Data), а в классе Data уже сохранять информацию о том, как надо работать с данными. Короче, придумать обобщённый интерфейс. Но и тут без перебора вариантов if'ами или свичем не обойдётся.

UPD: Совсем забыл, если вы планируете работать с этой структурой, заранее зная расширения файла, например вот так:

var textData = Extractors.Get(Extensions.TXT);

То советую пересмотреть Ваш вариант, возможно иная структура классов или иной метод получения нужного экстрактора подойдёт лучше. Вот например:

var extractor = new TextDataExtractor();
READ ALSO
Приведение типов в дженериках

Приведение типов в дженериках

Есть у меня некоторый обобщённый класс, который делает Request и отдаёт Response:

71
Как добавить все namespace для Unit-теста?

Как добавить все namespace для Unit-теста?

Как добавить namespace TestApp, TestAppController, TestApp

84
Повторное выполнение SQL запроса

Повторное выполнение SQL запроса

Есть веб приложение на PHP + БД на MySQLПосле выполнения какого-либо SQL запроса путем отправки данных через HTML форму, если обновить страницу, то SQL запрос...

104
Как сделать динамические мета-теги?

Как сделать динамические мета-теги?

Есть сайт в формате siteru, есть алиас домена krd

75