我想在内存存储库中实现一个简单的(仅用于测试目的),如下所示。它实现的接口是通用的。下面的示例代码中使用了“删除”方法之一。
谓词的强制转换抛出异常。如何正确实现删除的方法?
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);
}
}
答案 0 :(得分: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);
}
}
答案 1 :(得分: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
会给你你需要的东西。