将实现强制转换为具有泛型类型的接口

本文关键字:泛型类型 接口 实现 转换 | 更新日期: 2023-09-27 18:34:41

我的公司有一个共享库,其中包含这样的代码

public interface IBaseService<TBaseUser> where TBaseUser : BaseUser
{
   // snip
}
public class User : BaseUser
{
    // snip
}
public class SomeService : IBaseService<User>
{
}

各种应用程序都使用此共享代码。我正在尝试编写一个基本控制器,该控制器在其 ctor 中接受IBaseService<BaseUser>

public class BaseController : Controller
{
    public BaseController(IBaseService<BaseUser> service)
    { 
    }
}

库级别的代码完全按照我的预期工作,但是当我尝试从消费应用程序使用它并传入派生类型(即Service类型(时,它会失败并带有无效的强制转换。

public class MyController : BaseController
{
    public MyController(SomeService service) : base(service)
    {
    }
}

我想做的事情可能吗?

将实现强制转换为具有泛型类型的接口

你的IBaseService -iterface 需要是协变的:

interface IBaseService<out T> 

这样,您可以将IBaseService<User>的实例分配给IBaseService<BaseUser>