因为我不知道如何清楚地解释我的问题,我举个例子! 我有这些接口和类:
public interface IParam
{
....
}
public class Param1:IParam
{
....
}
public class Param2:IParam
{
....
}
public interface IParamDbService<TEntity> where TEntity : IParam
{
IQueryable<TEntity> GetAll();
}
public class Param1DbService : IParamDbService<Param1>
{
public IQueryable<Param1> GetAll()
{
...
}
}
public class Param2DbService : IParamDbService<Param2>
{
public IQueryable<Param2> GetAll()
{
...
}
}
在某些情况下,我需要这样做:
IParamDbService<Param> paramDbService;
IParamDbService<Param1> param1DbService;
IParamDbService<Param2> param2DbService;
paramDbService=param1DbService; or paramDbService=param2DbService;
我在代码中使用paramDbService
,因此有时我需要将param1DbService
复制到其中,然后othe param2DbService
。但它们有不同的类型,所以我不能这样做。任何想法?
答案 0 :(得分:2)
使其协变(注意out TEntity
):
public interface IParamDbService<out TEntity> where TEntity : IParam
{
IQueryable<TEntity> GetAll();
}
IParamDbService<IParam> paramDbService;
IParamDbService<Param1> param1DbService;
paramDbService=param1DbService
如果您将其他方法添加到DbService(其中TEntity
作为参数),则它不再是协变的。您需要将界面拆分为只包含阅读部分的DbReader<out TEntity>
和DbService<TEntity>
以及其他所有内容。
或者,您可以根据IParam创建写作成员,以使它们协变。