Моего сценария:Базовый класс Enum реализованы по-разному в производных классов
public class EntityBase
{
public int ID { get; set; }
[Required()]
public string Name { get; set; }
//And this is what is getting me
//I want a "Type" enum
}
Тогда производные классы будут иметь разные перечисления, что они присваиваемые тип.
public class AnimalEntity : EntityBase
{
//Type would have an 'animal type' value: Land, Sea or Air
//Implementation code would do something like:
// myAnimal.Type = AnimalType.Land
}
public class PersonEntity : EntityBase
{
//Type would have a 'person type' value: Doctor, Lawyer or Engineer
//Implementation code would do something like:
// myPerson.Type = PersonType.Lawyer
}
public class MonsterEntity : EntityBase
{
//Type would have a 'monster type' value: Goblinoid, Undead
}
Итак, большой вопрос, что я пытаюсь сделать, правильно? Я пытаюсь создать базовый класс репозитория, который будет возвращать сущности, сгруппированные по типу. Все мои сущности будут иметь какой-то «тип», и я хочу создать общую «группу по типу».
public abstract class RepositoryBase<T> : IRepositoryBase<T> where T : EntityBase
{
//Our common GetAsync, GetByIdAsync, and all our other CRUD
//And then something like this:
public IEnumerable<GroupedData<string, T>> GetGroupedByType(string searchTerm)
{
var entities =
from s in DbSet
where (searchTerm == null || s.Name.ToLower().Contains(searchTerm))
group s by s.Type into g
select new GroupedData<string, T> { Key = g.Key.ToString(), Data = g };
return (entities);
}
}
Когда T является AnimalEntity, я получаю группы Land, Sea и Air с соответствующими объектами. Для PersonEntity я хотел бы получить группы Doctor, Lawyer, Engineer.
Если мой подход/дизайн недействителен или не идеален, сообщите мне.
Что не так с указанием перечисления в родовом? 'EntityBase' и т. Д. Я не уверен, что я решил сделать это сам, чтобы быть честным, но это все равно возможно. Тем не менее, я понятия не имею, как вы интегрируете это в группировку. Я лично не буду создавать стиль, основанный на попытке комбинировать общий код. Я бы проектировал материал, а затем определял, где находится общая логика. Например, вместо изменения enum, почему бы не каждый производный репозиторий реализовать функцию группировки? –
@AdamHouldsworth Если я ошибаюсь, похоже, что цель состоит в том, чтобы ввести типизированное перечисление производного класса в качестве ключа. Джейсон, ты можешь это подтвердить? – samy
@AdamHouldsworth - Я начинаю приближаться к вашей линии мышления. Попытка абстрагировать группу по типу может оказаться недостаточной для всех остальных обручей. Благодарю. – Jason