2012-01-13 58 views
2

我想在内存资源库中实现一个简单的(仅用于测试目的),如下所示。它实现的接口是通用的。下面的示例代码使用了其中一种“删除”方法。使用泛型func签名

谓词转换抛出异常。我如何正确实施删除的方法?

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 >谓词)'? – 2012-01-13 17:02:55

+0

我的界面如下所示,这就是为什么... public interface IUpdateModel { void Save (T dto)其中T:class,IDto; void更新(T实体)其中T:class,IDto; void删除(表达式> predicate)其中T:class,IDto; void删除(T实体)其中T:class,IDto; } public interface IUpdateModel 其中T:IDtovoid Save(T dto); void Update(T entity); void删除(Expression > predicate); void删除(T实体); } – 2012-01-13 18:20:00

回答

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

谢谢丰富,它的作品。你的第二个建议是正确的。实际上,我已经有了类级别的泛型实现。我想使用简单的ctor注入的方法级别泛型版本来取决于这个存储库。这只是为了测试目的,所以你的实现将会很好地工作。 – 2012-01-13 17:24:13

+0

什么是IEntity?你不是指“TEntity”吗? – Nuffin 2012-01-13 17:36:20

+0

这是TEntity,他有一个错字。 – 2012-01-13 18:13:31

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 

会给你你所需要的。