2012-01-13 10 views
2

以下のように、単純な(テスト目的のみ)をメモリリポジトリに実装したいと考えています。実装するインターフェースは一般的です。以下のサンプルコードでは、「削除」メソッドの1つが使用されています。汎用ファンクションシグネチャを使用する

述語のキャストによって例外がスローされます。削除されたメソッドを正しく実装するにはどうすればよいですか?

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(式>述語)'を使用しないのですか? –

+0

私のインターフェイスは以下のようになっています。その理由は... パブリックインターフェイスIUpdateModel { 保存(T dto)T:class、IDto; void更新(Tエンティティ)T:class、IDto; void (式>述語)ここでT:class、IDto; void (Tエンティティ)T:class、IDto; }パブリックインターフェイスIUpdateModel T:IDto {ボイド保存(TのDTO)。 void Update(Tエンティティ)。 void Delete(式>述語); 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

ありがとうリッチ、それは動作します。あなたは2番目の提案で正しいです。実際、私はすでにクラスレベルのジェネリックス実装を持っています。私はこのリポジトリに依存するクラスにメソッドレベルジェネリックの単純なctor注入を使用したかったのです。これはテスト目的のためのものなので、実装が美しく機能します。 –

+0

「IEntity」とは何ですか?あなたは 'TEntity'を意味しませんでしたか? – Nuffin

+0

それはTEntityです、彼はタイプミスがあります。 –

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

TEntityIDtoを実装参照型であるTEntityをとる述語に入力された式を取り

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

それが何であるかをされていない、Func<IDto, bool>に表現の述語をキャストします。

は、あなたがここに欲しいものだけに、いくつかのバリエーションがありますが、私はと思われる:

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

はあなたが必要なものを提供します。

関連する問題