8

我正在研究一些协方差/逆变的东西,我有一个更广泛的问题,但这一切都归结为:

GenericRepository<BaseEntity> repo = new GenericRepository<ProductStyle>(context);

这不起作用,即使 BaseEntity 是 ProductStyle 的父抽象类,有没有办法实现这一点?

4

2 回答 2

6

这样做的唯一方法是在(不是 a )out上使用通用限制(这将使保存对象变得困难,但可以很好地检索它们)。如果你有:interfaceclass

interface IGenericRepository<out T> {...}

然后IGenericRepository<ProductStyle>可以将 an 分配给 type 的变量IGenericRepository<BaseEntity>,因为 all ProductStyleare also BaseEntity,并且我们将自己限制为协变/out用法:

IGenericRepository<BaseEntity> tmp = GetRepo<ProductStyle>(context);
// note that the right-hand-side returns IGenericRepository<ProductStyle>
...
private IGenericRepository<T> GetRepo(...) {...}

但是请注意,这种协变 /out用法使得无法执行以下操作:

interface IGenericRepository<out T>
{
    T Get(int id); // this is fine, but:
    void Save(T value); // does not compile; this is not covariantly valid
}
于 2013-08-13T12:02:44.020 回答
0

我只是想知道这样的东西是否也有用——使用对 GenericRepository 定义的限制来限制T可以是的基本类型:

void Main()
{
    var repo = new GenericRepository<ProductStyle>(new ProductStyle());
    Console.WriteLine(repo.ToString());  //just output something to make sure it works...
}

// Define other methods and classes here
public class GenericRepository<T> where T : BaseEntity {
    private readonly T _inst;

    public GenericRepository(T inst){
        _inst = inst;
        _inst.DoSomething();
    }
}

public class BaseEntity {
    public Int32 Id {get;set;}

    public virtual void DoSomething() { Console.WriteLine("Hello"); }
}

public class ProductStyle : BaseEntity {
}

因此,如果您有一个GetRepo<T>方法,该方法可以返回 T 的 GenericRepository,并且您确信它TBaseEntity.

于 2013-08-13T12:16:53.673 回答