C# - 动态返回通用接口

3

我想根据一个标志返回两个仓库实例中的一个。我的仓库接口和实现如下:

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>();
        }
    }

有谁能指点一下我,关于这个应该如何编写的正确方向是什么?

谢谢


1
那其实没有意义。你为什么想要这样做呢? - SLaks
我想我只是在错误地思考这个问题。 - David Gutierrez
1个回答

7

只有当两种类型共享一个基本类型或接口,并且仅当接口是协变的(而你的接口不是)时,才能实现这一点:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接