使用通用功能签名

时间:2012-01-13 16:55:40

标签: c# linq generics

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

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

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 个答案:

答案 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

会给你你需要的东西。