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 ...}

返回存储库的两个实例之一的方法应该类似于:

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

谁能指出我应该如何写的正确方向?

谢谢

4

1 回答 1

7

只有当这两种类型共享一个共同的基本类型或接口时,这才有效,并且只有接口是协变的(你的不是):

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

返回IRepository未指定类型的 an 是没有意义的;通用成员将无法使用。

于 2012-08-23T15:58:05.587 回答