|
27 / 12 / 1
Регистрация: 20.05.2015
Сообщений: 217
|
|||||||||||
Рефлексия обобщенных коллекций для вызова методов при неизвестном типе08.06.2022, 18:01. Показов 1533. Ответов 23
Если вкратце: Использую Entity Framework в котором используется множество коллекций сущностей DbSet;
Все коллекции разные, но почти все имеют общую суть (обрабатываются одинаково). Вопрос, как мне через рефлексию сделать возможным работу со всеми коллекциями одним кодом (типа Load, преобразование в таблицу, Save и прочие непотребства). Можно, конечно, каждый раз все таблицы перечислять, но как-то это не по програмерски. Абстрактный нерабочий пример (так как в метод расширение Load надо передать обобщение с аргументом):
0
|
|||||||||||
| 08.06.2022, 18:01 | |
|
Ответы с готовыми решениями:
23
Рефлексия обобщенных типов Алгоритм для вызова методов с массива Специальные методы для вызова необъявленных методов объекта |
|
27 / 12 / 1
Регистрация: 20.05.2015
Сообщений: 217
|
||||||||
| 20.11.2022, 14:21 [ТС] | ||||||||
. Это-то относительно просто. Кликните здесь для просмотра всего текста
Можно, конечно попробовать эту библиотеку мета программирования, но что-то лень пока для столь малой задачи ... Думал может есть более элегантные способы без 20 Честно признаться не понимаю этих претензий к скорости работы рефлексии с в контексте работы с DataTable с её распаковкой/запаковкой типов. Мне кажется заполнение средних размеров таблицы всё равно будет на порядок дольше, чем работа рефлексии (возможно ошибаюсь). В целом то всё равно в обоих периметрах по ссылке используются джейнерики, то есть всё равно надо явно указать тип членов списка, что опять приводт к необходимости использования 20 строк кода в место одной (о ужас ), то есть к тому же, что я написал выше (правда согласен, надо вытащить конвертацию)
0
|
||||||||
|
Модератор
|
|||||
| 20.11.2022, 15:26 | |||||
|
Вы получаете в DataTable данные одной таблицы БД. Соответственно, TableName должен содержать имя этой таблицы. И по имени таблицы из DbContext можно получить тип сущности для этой таблицы. То есть в обобщённом методе, как мне кажется, нет необходимости. Так же раз этот тип будет из DdContext, то он гарантированно содержит конструктор по умолчанию. Его нужно или явно передать, или получить из атрибута сущности. Замена символов, возможно, нужна для Представления, ну там и стоит это преобразование проводить. Добавлено через 5 минут И рефлексией проверять, есть дженерик или нет. И если есть, то сущность это 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
|
|||||
|
27 / 12 / 1
Регистрация: 20.05.2015
Сообщений: 217
|
||||||||||||||
| 20.11.2022, 16:25 [ТС] | ||||||||||||||
|
такой вариант ругается, что нельзя динамически создать DBSet (WellID - это базовый класс для всех таблиц с полями имя и ID)
![]() Но в целом задача, конечно, не стоит затраченных усилий, уже больше спортивный интерес .
0
|
||||||||||||||
|
Модератор
|
|||
| 20.11.2022, 16:34 | |||
|
Рефлексия чаще всего и используется в библиотеках на целенных на широкое использование во избежание явных зависимостей. Если да, то это данные БД. А с БД работает DbContext, а не DbSet. DbSet для конкретной БД подготавливается DbContext'ом. Поэтому вам нужно передавать SomeMethod<TDbContext>(....) where TDbContext : DbContext, new().
1
|
|||
| 20.11.2022, 16:34 | |
|
Рефлексия методов и конструкторов Наследование,переопределение методов[рефлексия] Какой алгоритм выбрать для меньшего кол-во вызова api-методов? Рефлексия методов с неизвестным массивом параметров
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки
Правым кликом по серверу -> отладочная информация -> edit
Заменить "net": "raw", на "net": "tcp",
Нажать кнопку reload.
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|