2012-01-13 4 views
2

Я хотел бы реализовать простой (только для тестирования) в репозитории памяти, как показано ниже. Интерфейсы, которые он реализует, являются общими. Один из методов «Удалить» используется в примере кода ниже.Использование generic func signature

Бросок предиката исключает. Как я могу реализовать удаленный метод правильно?

public class InMemoryReportingRepository : IReportingRepository 
{ 
    private readonly List<IDto> m_dtos; 

    public InMemoryReportingRepository() 
    { 
     m_dtos = new List<IDto>(); 
    } 

    // ommitted stuff 

    public void Delete<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class, IDto 
    { 
     var delete = m_dtos.FirstOrDefault((Func<IDto, bool>) predicate.Compile()); 

     m_dtos.Remove(delete); 
    } 
} 
+2

Почему бы просто не использовать 'public void Delete (Expression > предикат)'? –

+0

Мои интерфейсы подобны ниже, вот почему ... public interface IUpdateModel { void Сохранить (T dto) где T: class, IDto; void Обновить (объект T), где T: class, IDto; void Удалить (выражение > предикат), где T: class, IDto; void Удалить (объект T), где T: class, IDto; } общественный интерфейс IUpdateModel где T: IDto { void Save (T dto); void Update (объект T); void Удалить (выражение > предикат); void Удалить (объект T); } –

ответ

1

Попробуйте следующее:

public void Delete<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class, IDto 
{ 
    var compiled = predicate.Compile(); 
    var toDelete = m_dtos.FirstOrDefault(dto => (dto is TEntity) && compiled((TEntity)dto)); 
    m_dtos.Remove(delete); 
} 

Func<TEntity, bool> и Func<IDto, bool> совершенно разные типы, поэтому ваш бросок не удалось.

Однако, я рекомендовал бы использовать дженерики уровня класса для памяти хранения данных:

public class DataStore<TEntity> : IDataStore<TEntity> where TEntity : class, IDto 
{ 
    private readonly List<TEntity> m_dtos = new List<TEntity>(); 
    ... 
    public void Delete(Func<TEntity, bool> predicate) 
    { 
    var toDelete = m_dtos.FirstOrDefault(predicate); 
    m_dtos.Remove(toDelete); 
    } 
} 
+0

Спасибо, Rich, он работает. Вы верны в своем втором предложении. Фактически, у меня уже есть реализация генерических средств класса. Я хотел использовать версию дженериков уровня метода простой инъекции ctor для классов, которые зависят от этого репозитория. Это только для целей тестирования, поэтому ваша реализация будет работать красиво. –

+0

Что такое 'IEntity'? Разве вы не имели в виду «TEntity»? – Nuffin

+0

Это TEntity, у него есть опечатка. –

0
public void Delete<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class, IDto 

принимает выражение напечатанный на предикат, который принимает TEntity где TEntity является ссылочным типом, который реализует IDto

(Func<IDto, bool>) predicate.Compile(); 

Слепки предикат выражения с Func<IDto, bool>, который не то, что она есть.

Там есть несколько вариантов на только то, что вы хотите, но я подозреваю, что:

public void Delete<TEntity>(Expression<Func<IDto, bool>> predicate) where TEntity : class, IDto 

даст вам то, что вам нужно.

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