2

因为我不知道如何清楚地解释我的问题,所以我举个例子!我有这些接口和类:

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到它和其他时间。param2DbService但它们有不同的类型,所以我不能这样做。有什么想法吗?

4

1 回答 1

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 使写作成员也成为协变的。

于 2013-05-28T09:18:39.117 回答