0

У меня есть два интерфейса в различных проектах (эти проекты не ссылаются друг на друга), которые имеют одни и те же методы, как это:Преобразовать класс возможного интерфейса

В первом проекте мы имеем:

public interface IInterfaceA 
{ 
    IAViewModel Do(); 
} 
public interface IAViewModel 
{ 
    int Id { get; set; } 
} 
public class ServiceA : IInterfaceA 
{ 
    public IBViewModel Do() 
    { 
     return null; 
    } 
} 

Во втором проекте мы имеем:

public interface IInterfaceB 
{ 
    IBViewModel Do(); 
} 
public interface IBViewModel 
{ 
    int Id { get; set; } 
} 

Я могу создать экземпляр ServiceA во время выполнения, используя некоторые Отражение, со второго проекта.

Вопрос в том, как я могу преобразовать эту услугу в IInterfaceB. Я имею в виду, что хочу получить доступ к его методам, когда кто-то развивается, ссылаясь на IInterfaceB.

+1

«Эти проекты не связаны друг с другом», вы имеете в виду, что вы загружаете типы другой сборки во время выполнения или что-то еще? – jdphenix

+1

@SaeedHamed, если тип не реализует интерфейс, тогда вы не можете использовать интерфейс для вызова методов по типу. Не имеет значения, что тип реализует другой интерфейс с идентичным методом. – phoog

+1

@phoog: обратите внимание, что в этом примере кода 'ServiceA' делает _not_ реализацию другого интерфейса с идентичным методом. Единственный отображаемый метод Do() возвращает экземпляр «IBViewModel», который не позволяет ему реализовывать «IInterfaceA». –

ответ

1

Если я правильно понял ваш обновленный вопрос, то тот факт, что класс ServiceA реализует IInterfaceA, не имеет отношения к вопросу (вы даже не знаете реализованного участника).

Что касается вопроса вы, кажется, спрашивать — можно ли лечить экземпляр ServiceA, как если бы это был экземпляр реализации IInterfaceB — ответ на этот вопрос «нет».

Однако, вы можете приблизить этот результат, в одном, по крайней мере, двумя способами:

  1. Используйте dynamic типа. Здесь объект не будет отображаться как IInterfaceB, но вы можете хотя бы вызвать метод Do() с помощью переменной, напечатанной как dynamic.
  2. Оберните экземпляр ServiceA в классе адаптера, который реализует IInterfaceB, и который делегирует его реализацию экземпляру ServiceA. Затем вы можете использовать экземпляр класса-оболочки, где вам нужен объект, который реализует IInterfaceB.

Например:

class BAdapter : IInterfaceB 
{ 
    private readonly ServiceA _serviceA; 

    public BAdapter(ServiceA serviceA) 
    { 
     _serviceA = serviceA; 
    } 

    public IInterfaceB Do() { return _serviceA.Do(); } 
} 

Вы можете альтернативно объявить _serviceA (и параметр конструктора тоже) в приведенном выше примере, как dynamic, и достичь того же результата.

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