2

フラグに基づいて 2 つのリポジトリ インスタンスのいずれかを返そうとしています。私のリポジトリ インターフェイスと実装は次のようになります。

public interface IRepository<T>
{
    T Insert(T entity);
    void Delete(T entity);
    IEnumerable<T> SearchFor(Expression<Func<T, bool>> predicate);
    IEnumerable<T> GetAll();
    T SearchForFirst(Expression<Func<T, bool>> predicate);
    bool Has(Expression<Func<T, bool>> predicate);
}

class Repository<T> : IRepository<T> where T : class    { ... implementation here ...}

リポジトリの 2 つのインスタンスのうちの 1 つを返すメソッドは、次のようになります。

    public IRepository<T> GenerateRepository(bool flag)
    {
        if ( flag ) {
           return new Repository<MyFirstType>();
        } else {
           return new Repository<MySecondType>();
        }
    }

これが実際にどのように書かれるべきかについて、誰かが私を正しい方向に向けることができますか?

ありがとう

4

1 に答える 1

7

これは、2つのタイプが共通のベースタイプまたはインターフェイスを共有し、インターフェイスのみが共変である場合にのみ機能します(これはあなたのものではありません)。

public IRepository<CommonAncestor> GenerateRepository(bool flag)
{
    if (flag) {
       return new Repository<MyFirstType>();
    } else {
       return new Repository<MySecondType>();
    }
}

IRepository不特定のタイプのを返すことは意味がありません。ジェネリックメンバーは使用できません。

于 2012-08-23T15:58:05.587 に答える