我正在研究一些协方差/逆变问题,我有一个更广泛的问题,但这一切归结为:
GenericRepository<BaseEntity> repo = new GenericRepository<ProductStyle>(context);
这不起作用,即使BaseEntity是ProductStyle的父抽象类,有没有办法实现这个目标?
答案 0 :(得分:6)
执行此操作的唯一方法是使用out
通用限制(这样可以很难保存对象,但很难检索它们),在 interface
上(不是class
)。如果你有:
interface IGenericRepository<out T> {...}
然后可以将IGenericRepository<ProductStyle>
分配给IGenericRepository<BaseEntity>
类型的变量,因为所有ProductStyle
也是BaseEntity
,我们将自己限制为协变/ {{1用法:
out
但请注意,这种协变/ IGenericRepository<BaseEntity> tmp = GetRepo<ProductStyle>(context);
// note that the right-hand-side returns IGenericRepository<ProductStyle>
...
private IGenericRepository<T> GetRepo(...) {...}
用法使得无法执行以下操作:
out
答案 1 :(得分: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,并确保T
是BaseEntity
的子项。