Я знаю, что ответ не будет простым, и я уже использую пару (я думаю, некрасивых) обломков. Я просто ищу элегантные ответы.
Абстрактный класс:
public interface IOtherObjects;
public abstract class MyObjects<T> where T : IOtherObjects
{
...
public List<T> ToList()
{
...
}
}
Дети:
public class MyObjectsA : MyObjects<OtherObjectA> //(where OtherObjectA implements IOtherObjects)
{
}
public class MyObjectsB : MyObjects<OtherObjectB> //(where OtherObjectB implements IOtherObjects)
{
}
Возможно ли, циклически проходя по коллекции MyObjects (или другой подобной группировки, универсальной или другой), чтобы затем использовать в ToList метод базового класса MyObjects , как мы это делаем конкретно не знаю тип Т на данный момент.
EDIT
Что касается конкретных примеров, когда бы это ни возникало, я некоторое время думал об этом и вместо этого делал что-то другое, так что в настоящее время нет никаких требований. но так как это случалось довольно часто, я думал, что я это спущу.
EDIT
@ Сара, это не особый тип коллекции, о которой я забочусь, это может быть List, но все же метод ToList каждого экземпляра относительно неприменим, без анонимного типа)
@ aku, правда, и этот вопрос может быть относительно гипотетическим, однако он может быть извлечен и работать со списком объектов T, зная, что только их базовый тип был бы очень полезен. Получение ToList, возвращающего список BaseType, было одним из моих обходных путей
РЕДАКТИРОВАТЬ @ all: До сих пор это была дискуссия, на которую я надеялся, хотя она в значительной степени подтверждает все мои подозрения. Спасибо всем до сих пор, но кто-либо еще, не стесняйтесь вводить.
РЕДАКТИРОВАТЬ @ Роб, Да, это работает для определенного типа, но не тогда, когда тип известен только как список объектов IOtherObject.
@ Роб Снова Спасибо. Это обычно был мой грубый обходной путь (неуважение :)). Либо так, либо с помощью функции ConvertAll для Downcast через делегата. Спасибо, что нашли время, чтобы понять проблему.
ПРАВИЛА КВАЛИФИКАЦИИ на случай, если я немного запутался
Если быть более точным, (возможно, моя последняя реализация этого слишком усложнила):
Допустим, у меня есть 2 типа объектов, B и C наследуются от объекта A.
Многие сценарии представили себя где, из Списка B или Списка C, или в других случаях из Списка того или другого - но я не знаю, что, если я нахожусь в базовом классе, мне нужно меньше Конкретный список А.
Приведенный выше пример представляет собой разбавленный пример последнего воплощения проблемы Список .
Обычно он представляет себя, как я думаю, через возможные сценарии, которые ограничивают объем кода, который требует написания, и кажутся немного более элегантными, чем другие варианты. Я действительно хотел обсудить возможности и другие точки зрения, которые я получил более или менее. Я удивлен, что до сих пор никто не упомянул ConvertAll (), так как это еще один обходной путь, который я использовал, но слишком многословный для рассматриваемых сценариев
@ Роб Еще раз и Сара
Спасибо, однако я чувствую, что я понимаю дженерики во всей их статической контекстной славе, и действительно понимал проблемы, возникающие здесь.
Фактический дизайн нашей системы и использование ее дженериков (и я могу сказать это без единого уклона, поскольку я был только одним из игроков в дизайне), были выполнены хорошо. Именно тогда, когда я работал с основным API, я обнаружил ситуации, когда я был не в том направлении, чтобы просто что-то делать, вместо этого мне приходилось иметь дело с ними немного менее элегантно, чем мне нравится (пытаясь либо быть умным, или, может быть, ленивый - я приму любой из этих ярлыков).
Мое отвращение к тому, что я назвал клэджем, в основном заключается в том, что нам требуется выполнить цикл по нашему набору записей, чтобы просто преобразовать объекты в их базовое значение, что может быть ударом по производительности.
Думаю, мне было интересно, сталкивался ли кто-нибудь еще с этим в их кодировании раньше, и был ли кто-то умнее или, по крайней мере, более элегантным, чем я, когда сталкивался с этим.