如何将泛型类的对象复制到具有继承类型的另一个对象?

时间:2013-05-28 09:08:32

标签: c# generics interface

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

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。但它们有不同的类型,所以我不能这样做。任何想法?

1 个答案:

答案 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创建写作成员,以使它们协变。