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

C# 如何将泛型类的对象复制到具有继承类型的另一个对象?,c#,generics,interface,C#,Generics,Interface,因为我不知道如何清楚地解释我的问题,我举个例子! 我有以下接口和类: public interface IParam { .... } public class Param1:IParam { .... } public class Param2:IParam { .... } public interface IParamDbService<TEntity> where TEntity : IParam { IQueryable<TEntity

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

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()
   {
      ...
   }
}  
公共接口IPRAM { .... } 公共类Param1:IParam { .... } 公共类Param2:IParam { .... } 公共接口IParamDbService,其中tenty:IParam { IQueryable GetAll(); } 公共类Param1DbService:IParamDbService { 公共IQueryable GetAll() { ... } } 公共类Param2DbService:IParamDbService { 公共IQueryable GetAll() { ... } } 在某些情况下,我需要这样做:

 IParamDbService<Param> paramDbService;
 IParamDbService<Param1> param1DbService;
 IParamDbService<Param2> param2DbService;

 paramDbService=param1DbService; or  paramDbService=param2DbService;
IParamDbService参数服务;
IParamDbService param1DbService;
IParamDbService param2DbService;
paramDbService=param1DbService;或paramDbService=paramDbService;
我在代码中使用了
paramDbService
,因此有时我需要将
paramDbService
复制到其中,而另一次则是
paramDbService
。但它们的类型不同,所以我不能这样做。有什么想法吗?

使其协变(注意
out tenty
):

公共接口IParamDbService,其中tenty:IParam
{
IQueryable GetAll();
}
IParamDbService参数服务;
IParamDbService param1DbService;
paramDbService=param1DbService
如果您将其他方法添加到DbService,将
TEntity
作为参数,那么它就不再是协变的。您需要将接口拆分为一个
DbReader
,其中只包含读取部分,而
DbService
包含所有其他部分


或者,您可以使编写成员基于IParam,以使其协变。

您的示例毫无意义。两个DbService的返回类型是
IQueryable
-
BankKind
不是示例的一部分。此外,
Param
也是未知的。我编辑了它。谢谢。谢谢。对于上述问题,在可编辑模式下我应该怎么做?@raha:假设您有一个方法
更新(tenty实体)
。您的服务将其实现为
更新(Param1实体)
。您不能将其称为
Update(ipram实体)
,因为
ipram
可能是其他东西。对于这种情况,有几种解决方案。如果您有一个具体的案例,请就stackoverflow再问一个问题。@Stefan:Tankyou,是的,我认为我应该在这种情况下使用IParam。(请您根据此评论更改您的答案,然后我可以将其作为答案。)
public interface IParamDbService<out TEntity> where TEntity : IParam
{
    IQueryable<TEntity> GetAll();
}

IParamDbService<IParam> paramDbService;
IParamDbService<Param1> param1DbService;

paramDbService=param1DbService