2017-01-31 8 views
0

У меня возникла проблема с внедрением объекта в его реализованный интерфейс. В разных сборках интерфейсы также используют Generics.Объект кастинга для реализованных интерфейсов

У меня 3 библиотеки. контрактов (интерфейс) Место Реализация (Интерфейс Реализация) MainAssembly (Случаются быть приложение ASP.NET MVC5)

Основные референции контракты и Реализации. Реализации ссылок Контракты.

Контракты Содержат 2 Интерфейсов, один использует общее, который имеет другого типа интерфейса

public interface IConfig{} 
public interface IStore<TConfig> where TConfig : IConfig{} 

Реализация Содержит 2 классов, реализующие эти интерфейсы, как это.

public class ConfigBase : IConfig {} 
public class Store<TConfig> :IStore<TConfig> where TConfig : ConfigBase {} 

ASP.NET приложение имеет класс, который наследуется от класса ConfigBase

public class Configuration : ConfigBase {} 

В договорах библиотеки, есть класс обслуживания, который содержит метод, который требует тип Istore

public void DoSomething(IStore<IConfig> store){} 

Однако Передача в виде магазина говорит мне, что он не может его преобразовать. Здесь происходит ошибка времени компиляции, все, что нужно для правильной сборки.

Store<Configuration> store = new Store<Configuration>(); 
serviceObj.DoSomething(store); 
+0

Для того, чтобы работать, вы должны были бы сделать '' TConfig' в IStore' ковариант. https://msdn.microsoft.com/en-us/library/dd799517(v=vs.110).aspx – juharr

+0

Ahh, Спасибо, мне просто нужно было изменить IStore на IStore

+0

Обратите внимание, что вы должны делать это только если 'TConfig' используется только как выход (возврат методов и свойств только для чтения), а не как вход (аргументы метода и свойства записи) в' IStore'. – juharr

ответ

0

Сделать вас общий интерфейс ковариантны с использованием out родового модификатора

public interface IStore<out TConfig> where TConfig : IConfig{}. 
+0

Спасибо, что это сработало. Собираюсь кое-что прочитать, чтобы попытаться полностью понять, что я только что сделал. –