使用泛型类型将实现强制转换为接口

时间:2016-02-15 10:32:40

标签: c# generics covariance contravariance

我公司有一个共享库,其代码如下

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)
    {
    }
}

我想做的是什么?

1 个答案:

答案 0 :(得分:2)

您的IBaseService - 表面必须为covariant

interface IBaseService<out T> 

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