2014-12-04 2 views
0

Проблема заключается в следующем: у меня есть метод, который (должен) возвращает другой список с заданным параметром типа. Это код:Возврат списка с использованием заданного параметра типа в C#

public IEnumerable<T> GetList<T>() { 
    if (typeof(T) == typeof(Account)) 
     return GetList().Select(m => m.Coordinator).Distinct(); 
    else if (typeof(T) == typeof(Blok)) 
     return null; 
    else if (typeof(T) == typeof(Curriculum)) 
     return null; 
    else if (typeof(T) == typeof(Program)) 
     return null; 
    return null; 
} 

для большинства из вас ошибка очевидна: «Не удается неявно преобразовать тип„System.Collections.Generic.IEnumerable < Domain.Models.Account>“на«System.Collections.Generic. IEnumerable < T> '. Явное преобразование существует (вам не хватает роли?) ". Это означает, что бросок решает проблему, например. ("(IEnumerable)" или "как IEnumerable"), но так ли это? Каков элегантный способ решения этого?

+0

мог кто-то проголосовал? – Ken

+1

Я не спустил вниз, но вы сделали общий метод, который может обрабатывать только несколько типов, что обычно является признаком плохого дизайна. –

+0

@ LasseV.Karlsen, это хороший комментарий, не могли бы вы привести пример того, как это можно написать? – Ken

ответ

2

Вы можете сделать это, просто заброса сообщение об ошибке говорит

return GetList().Select(m => m.Coordinator).Distinct() as IEnumerable<T>; 

Это может быть сделано с помощью общего хранилища, просто используя интерфейс. Если класс, реализующий этот репозиторий, попадает в базу данных или не имеет особого значения.

public interface IRepository<TEntity> 
{ 
    IEnumerable<TEntity> Get(
     Expression<Func<TEntity, bool>> filter = null, 
     Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, 
     string includeProperties = ""); 
    TEntity GetById(object id); 
    void Insert(TEntity entity); 
    void Delete(object id); 
    void Delete(TEntity entityToDelete); 
    void Update(TEntity entityToUpdate); 
} 

Пример реализация с использованием рамка сущности: (Это реально не имеет значения, если вы используете EF или просто класс макета здесь, вы могли бы просто заменить контекст/объекты с, например, список)

public class Repository<TEntity> : IRepository<TEntity>, IDisposable where TEntity : class 
{ 
    internal ApplicationContext Context; 
    internal DbSet<TEntity> Entities; 

    public Repository(ApplicationContext context) 
    { 
     if (Context == null) 
     { 
      throw new ArgumentNullException(); 
     } 

     Context = context; 
     Entities = Context.Set<TEntity>(); 
    } 

    public virtual IEnumerable<TEntity> Get(
     Expression<Func<TEntity, bool>> filter = null, 
     Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, 
     string includeProperties = "") 
    { 
     IQueryable<TEntity> query = Entities; 

     if(filter != null) 
     { 
      query = query.Where(filter); 
     } 

     query = includeProperties.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries) 
      .Aggregate(query, (current, includeProperty) => current.Include(includeProperty)); 

     return orderBy != null ? orderBy(query).ToList() : query.ToList(); 
    } 

    public virtual TEntity GetById(object id) 
    { 
     return Entities.Find(id); 
    } 

    public virtual void Insert(TEntity entity) 
    { 
     Entities.Add(entity); 
    } 

    public virtual void Delete(object id) 
    { 
     TEntity entityToDelete = Entities.Find(id); 
     Delete(entityToDelete); 
    } 

    public virtual void Delete(TEntity entityToDelete) 
    { 
     if (Context.Entry(entityToDelete).State == EntityState.Detached) 
     { 
      Entities.Attach(entityToDelete); 
     } 
     Entities.Remove(entityToDelete); 
    } 

    public virtual void Update(TEntity entityToUpdate) 
    { 
     Entities.Attach(entityToUpdate); 
     Context.Entry(entityToUpdate).State = EntityState.Modified; 
    } 
+0

это действительно решает проблему, но я не уверен, что это элегантный способ решения проблемы? – Ken

+0

Не могли бы вы привести мне пример? – Ken

Смежные вопросы