26 / 11 / 1
Регистрация: 20.05.2015
Сообщений: 211
|
|||||||||||
1 | |||||||||||
Рефлексия обобщенных коллекций для вызова методов при неизвестном типе08.06.2022, 18:01. Показов 886. Ответов 23
Если вкратце: Использую Entity Framework в котором используется множество коллекций сущностей DbSet;
Все коллекции разные, но почти все имеют общую суть (обрабатываются одинаково). Вопрос, как мне через рефлексию сделать возможным работу со всеми коллекциями одним кодом (типа Load, преобразование в таблицу, Save и прочие непотребства). Можно, конечно, каждый раз все таблицы перечислять, но как-то это не по програмерски. Абстрактный нерабочий пример (так как в метод расширение Load надо передать обобщение с аргументом):
0
|
08.06.2022, 18:01 | |
Ответы с готовыми решениями:
23
Рефлексия обобщенных типов Алгоритм для вызова методов с массива Специальные методы для вызова необъявленных методов объекта Рефлексия методов и конструкторов |
26 / 11 / 1
Регистрация: 20.05.2015
Сообщений: 211
|
||||||
20.11.2022, 14:21 [ТС] | 21 | |||||
Ну в целом я это уже и так реализовал своими корявыми руками . Это-то относительно просто.
Кликните здесь для просмотра всего текста
Можно, конечно попробовать эту библиотеку мета программирования, но что-то лень пока для столь малой задачи ... Думал может есть более элегантные способы без 20 Честно признаться не понимаю этих претензий к скорости работы рефлексии с в контексте работы с DataTable с её распаковкой/запаковкой типов. Мне кажется заполнение средних размеров таблицы всё равно будет на порядок дольше, чем работа рефлексии (возможно ошибаюсь). В целом то всё равно в обоих периметрах по ссылке используются джейнерики, то есть всё равно надо явно указать тип членов списка, что опять приводт к необходимости использования 20 строк кода в место одной (о ужас ), то есть к тому же, что я написал выше (правда согласен, надо вытащить конвертацию) Строго одной, таблицы и сущностью полностью одинаковые, у меня даже скриптик есть, который из всех таблиц генерирует класс со всеми сущностями, эдакий TableFirst
0
|
Модератор
|
|
20.11.2022, 15:26 | 22 |
Если правильно понял.
Вы получаете в DataTable данные одной таблицы БД. Соответственно, TableName должен содержать имя этой таблицы. И по имени таблицы из DbContext можно получить тип сущности для этой таблицы. То есть в обобщённом методе, как мне кажется, нет необходимости. Так же раз этот тип будет из DdContext, то он гарантированно содержит конструктор по умолчанию. Вот здесь бы я предпочёл сохранить имя таблицы БД в оригинале. Его нужно или явно передать, или получить из атрибута сущности. Замена символов, возможно, нужна для Представления, ну там и стоит это преобразование проводить. Добавлено через 5 минут Здесь нужен IList, или IEnumerable без дженерика. И рефлексией проверять, есть дженерик или нет. И если есть, то сущность это DbContext или нет. Для сущности DbContext получать имя таблицы из DbContext. Для остальных - проверять наличие атрибута [Table] , для свойств наличие атрибута [Column] .Добавлено через 2 минуты От дженериков лучше избавиться. Выше описал примерный путь. Сделать нужно на "чистой рефлексии". Можно для удобства использования потом добавить перегрузки с дженериками. Добавлено через 6 минут TableToList , ListToTable обычно не указывается из чего конвертируется.И лучше сделать как статические методы расширения. То есть более типично: public static IList ToList(this DataTable table) и public static WellDataTable ToTable(this IEnumerable objects) .Если добавится проверка согласованности с DbContext, то тогда можно передавать дженериком тип DbContext.
1
|
26 / 11 / 1
Регистрация: 20.05.2015
Сообщений: 211
|
|||||||||||
20.11.2022, 16:25 [ТС] | 23 | ||||||||||
Мозг плавиться...
такой вариант ругается, что нельзя динамически создать DBSet (WellID - это базовый класс для всех таблиц с полями имя и ID)
Ага, спасибо большое, поправлю, да это я на ходу между написаниями сообщений сделал, как мысль в голову легла. Надо, конечно, править. Спасибо, буду знать! Но в целом задача, конечно, не стоит затраченных усилий, уже больше спортивный интерес .
0
|
Модератор
|
|
20.11.2022, 16:34 | 24 |
Я так и понял.
Рефлексия чаще всего и используется в библиотеках на целенных на широкое использование во избежание явных зависимостей. Вы имя таблицы хотите получить? Если да, то это данные БД. А с БД работает DbContext, а не DbSet. DbSet для конкретной БД подготавливается DbContext'ом. Поэтому вам нужно передавать SomeMethod<TDbContext>(....) where TDbContext : DbContext, new() .
1
|
20.11.2022, 16:34 | |
20.11.2022, 16:34 | |
Помогаю со студенческими работами здесь
24
Наследование,переопределение методов[рефлексия] Какой алгоритм выбрать для меньшего кол-во вызова api-методов? Рефлексия методов с неизвестным массивом параметров Рефлексия. Вывод списка методов, свойств Рефлексия, можно ли получить имена параметров методов Для чего нужна рефлексия при подключении к БД? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства
Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
|
Что такое NullReferenceException и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
|
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
|
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
|
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
|
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
|
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее:
На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
|
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript
В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
|
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
|
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален
В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
|
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
|
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели
В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
|