我正在研究一些协方差/逆变的东西,我有一个更广泛的问题,但这一切都归结为:
GenericRepository<BaseEntity> repo = new GenericRepository<ProductStyle>(context);
这不起作用,即使 BaseEntity 是 ProductStyle 的父抽象类,有没有办法实现这一点?
这样做的唯一方法是在(不是 a )out
上使用通用限制(这将使保存对象变得困难,但可以很好地检索它们)。如果你有:interface
class
interface IGenericRepository<out T> {...}
然后IGenericRepository<ProductStyle>
可以将 an 分配给 type 的变量IGenericRepository<BaseEntity>
,因为 all ProductStyle
are 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
}
我只是想知道这样的东西是否也有用——使用对 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,并且您确信它T
是BaseEntity
.