|
26 / 11 / 1
Регистрация: 20.05.2015
Сообщений: 217
|
|||||||||||
Рефлексия обобщенных коллекций для вызова методов при неизвестном типе08.06.2022, 18:01. Показов 1406. Ответов 23
Если вкратце: Использую Entity Framework в котором используется множество коллекций сущностей DbSet;
Все коллекции разные, но почти все имеют общую суть (обрабатываются одинаково). Вопрос, как мне через рефлексию сделать возможным работу со всеми коллекциями одним кодом (типа Load, преобразование в таблицу, Save и прочие непотребства). Можно, конечно, каждый раз все таблицы перечислять, но как-то это не по програмерски. Абстрактный нерабочий пример (так как в метод расширение Load надо передать обобщение с аргументом):
0
|
|||||||||||
| 08.06.2022, 18:01 | |
|
Ответы с готовыми решениями:
23
Рефлексия обобщенных типов Алгоритм для вызова методов с массива Специальные методы для вызова необъявленных методов объекта |
|
26 / 11 / 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
|
|||||
|
26 / 11 / 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 | |
|
Помогаю со студенческими работами здесь
24
Рефлексия методов и конструкторов Наследование,переопределение методов[рефлексия] Какой алгоритм выбрать для меньшего кол-во вызова api-методов? Рефлексия методов с неизвестным массивом параметров
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча
Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове.
Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
|
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
|
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера»
Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит.
Придуман Биллом Госпером в 1970-х, опубликован в. . .
|
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb">
<style>
<!]>
</ style>
<g id="bush">
</ g>
</ svg>
function fn(){
let rost;/ / высота древа
let xx=165,yy=210,w=256;
|
|
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов,
содержащихся в реализации модуля. По-умолчанию все члены модуля доступны:
module Foo
let x = 10
let boo () = printfn "boo"
. . .
|
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible". . .
|
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов.
import "math"
func angleClock(hour int, minutes int) float64 {
. . .
|
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo
https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html
и его же старой инструкции по установке Lazarus с gtk2. . .
|