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