2016-02-15 4 views
1

Моя компания разделяемая библиотека, которая имеет такой кодКастинг реализации на интерфейс с общим типом

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

public class User : BaseUser 
{ 
    // snip 
} 

public class SomeService : IBaseService<User> 
{ 

} 

Различные приложения используют этот общий код. Я пытаюсь написать базовый контроллер, который принимает IBaseService<BaseUser> в своем ctor.

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

код на уровне библиотеки работает точно так, как я ожидал, но когда я пытаюсь использовать его из потребляющего приложения и передавать в производном типе, т.е. Service типа, она не сможет с некорректным гипсом ,

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

Является ли это тем, что я хочу сделать возможным?

+0

Похоже, ваш интерфейс должен быть ковариантным ... 'IBaseService '. Это не скомпилируется, если какой-либо из методов использует 'TBaseUser' как входную позицию, конечно ... –

+0

@JonSkeet Спасибо - я пренебрег упоминанием ковариации - я не могу сделать это ковариантным, поскольку интерфейс использует TBaseUser для возврата & входные значения. – Sam

+1

В этом случае SomeService просто не реализует 'IBaseService ' –

ответ

0

Ваш IBaseService -iterface должен быть covariant:

interface IBaseService<out T> 

Таким образом, вы можете назначить экземпляр IBaseService<User> для IBaseService<BaseUser>.

Смежные вопросы