c# - бросьте универсальный класс к его основному неуниверсальному классу

Поскольку у вас есть отношения один ко многим, вам нужно будет объединиться. Мне проще пойти по другому пути, то есть сгруппировать все товары по их типу и порядку по минимальной цене.

 $types = Product::with('type')->groupBy('type_id')
         ->select('type_id', \DB::raw('MIN(price) as minPrice'))
         ->orderBy('minPrice')
         ->get()
         ->pluck('type');

Это предполагает, что у вас есть отношение типа, определенное в продукте с именем «тип».

7
задан Buthrakaur 3 April 2009 в 07:07
поделиться

6 ответов

Я полагаю, что Вы хотите сделать поиск для определения выполнения к обходу интерфейсом.

Поэтому, возможно, добавьте интерфейс "IWalkable", который выставляет информацию, должен был сделать обход, затем можно создать проверку метода, чтобы видеть, реализует ли переданный объект интерфейс.

2
ответ дан 6 December 2019 в 14:09
поделиться

Попробуйте это:

if(start.GetType().GetGenericTypeDefinition() == typeof(CustomerWithChildern<>))
3
ответ дан 6 December 2019 в 14:09
поделиться

Вы могли переместить метод WalkHierarchy в базовый класс и сделать его виртуальным. Реализация базового класса только обработала бы текущий узел. Для CustomerWithChildern<T> класс, переопределение сделало бы фактический обход.

7
ответ дан 6 December 2019 в 14:09
поделиться

Я думаю, что все поражают эту "проблему" при первой работе с универсальными классами.

На Вашу первую проблему намекают в Вашей формулировке вопроса: открытый универсальный тип НЕ является базовым классом к закрытому. Нет никаких отношений OO здесь, вообще. Реальным базовым классом является CustomerBase. "Открытый" универсальный тип похож на полузавершенный класс; определение аргументов типа "закрывает" его, заставляя его завершиться.

В то время как можно сделать:

Type t = typeof(CustomerWithChildern<>)

условие

typeof(CustomerWithChildern<>).IsAssignableFrom(CustomerWithChildern<Foo>)

всегда будет Ложь.

- Oisin

1
ответ дан 6 December 2019 в 14:09
поделиться

И "Как" только работа над полностью определенными универсальными типами.

Посмотрите это обсуждение MSDN для деталей включая обходные решения.

Наиболее распространенное обходное решение, которое я видел, должно добавить интерфейс к соединению, которое Ваш CustomerWithChildren мог реализовать и проверить на тот интерфейс.

2
ответ дан 6 December 2019 в 14:09
поделиться

Явно с тем методом, нет. Однако можно достигнуть той же функциональности с интерфейсом. На самом деле у Вас могла просто быть своя универсальная реализация класса IEnumerable. Также стоит отметить, что Ваш класс должен также иметь "где T: CustomerBase" для обеспечения безопасности типов.

0
ответ дан 6 December 2019 в 14:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: