Я занимаюсь разработкой ORM. Я хочу, чтобы объекты моей коллекции можно было использовать в Linq. Занятия, которые я здесь написал, упрощены для ясности. Массив, содержащий объекты сущностей, находится в классе CollectionBase.
class EntityBase
{
public int fieldBase;
}
class EntityChild : EntityBase
{
public int fieldChild;
}
class CollectionBase : IEnumerable<EntityBase>
{
protected EntityBase[] itemArray;
//implementing the IEnumerable<EntityBase> is here. GetEnumerator method returns IEnumerator<EntityBase>
}
class CollectionChild : CollectionBase, IEnumerable<EntityChild>
{
public CollectionChild()
{
itemArray = new EntityChild[5]; //this is just an example.
}
//implementing the IEnumerable<EntityChild> is here. GetEnumerator method returns IEnumerator<EntityChild
}
Я попробовал несколько вещей.
Если CollectionChild не расширяет IEnumerable, собственные поля EntityChild не могут быть доступны в этом коде:
var list = from c in childCollection
where c.fieldChild == 1; // c references to an EntityBase object.
select c;
Если CollectionChild расширяет IEnumerable, даже невозможно использовать CollectionChild в Linq.
Произошла ошибка: «Не удалось найти реализацию шаблона запроса для типа источника« Generic_IEnumerableSample.CollectionChild ».« Где »не найдено. Рассмотрим явное указание типа переменной диапазона« childCollection ».»
Я попытался найти способ наследовать класс (в CollectionBase, который реализует IEnumerator) в CollectionChild как класс IEnumerator. Это не сработало, потому что невозможно переопределить методы, которые возвращают разные перечислители.
Все еще возможно не реализовать интерфейс IEnumerator для базового класса коллекции, а реализовать для всех дочерних классов коллекции. Но похоже, что это не аплодисменты OODesign.
Должен ли я изменить свой дизайн, или есть ли способ полностью переопределить методы или эффекты IEnumerable?