有一个继承通用接口的接口。
这是通用界面
public interface IBaseService<TEntity> where TEntity : BaseEntity
{
}
继承通用接口的接口
public interface IChatService :IBaseService<Messages>
{
}
然后我有一个类,该类将构造函数中的通用接口作为参数。
public class BaseApi
{
IBaseService<BaseEntity> _baseService;
public BaseApi(IBaseService<BaseEntity> baseService)
{
_baseService = baseService;
}
}
当我传递实现通用接口的接口对象时,不允许我传递接口的对象,它要求传递通用接口。
答案 0 :(得分:2)
这很合逻辑。通过重命名我们的类型并创建一个新示例,可以简化一些事情:
public class BaseApi
{
public BaseApi(IBucket<Fruit> baseService) { ... }
}
我们的IBucket<Messages>
代表一种具体类型的水果(苹果):
public interface IChatService :IBucket<Apple>
{
}
一桶苹果与一桶水果并不相同,因为您可以在后者中放一个橙子,而对前者则不能这样做。
要解决此问题,您可以更改IChatService
的签名:
public interface IChatService :IBaseService<BaseEntity>
{
}
或将预期的IBaseService<Messages>
类型传递给BaseApi
的控制器。
答案 1 :(得分:0)
您可以使用协方差来解决此问题。但前提是您的论据可以协变
public interface IBaseService<out TEntity> where TEntity : BaseEntity
{
}
https://docs.microsoft.com/en-us/dotnet/standard/generics/covariance-and-contravariance
答案 2 :(得分:-1)
看看这个:
public class BaseEntity
{
public int Id { get; set; }
public DateTime CreatedDate { get; set; }
}
public class Message : BaseEntity
{
public string Text { get; set; }
}
public interface IBaseService<TEntity> where TEntity : BaseEntity
{
string LogicalDelete();
}
public interface IChatService : IBaseService<Message>
{
bool SendMessage();
}
public class BaseApi<TEntity> : IBaseService<TEntity> where TEntity : BaseEntity
{
public BaseApi()
{
// You access to parent
}
public string LogicalDelete()
{
// Do somethins
}
}