Страницы

Поиск по вопросам

среда, 27 февраля 2019 г.

Передача в метод обобщенных интерфейсов

Имеется такой код:
public interface IInterface { IDictionary GetData(); }
public class Base { }
public class A: Base { }
public class B : Base { }
public class ADA: IInterface { public IDictionary GetData() { return new Dictionary(){ {0, new A() }}; } }
public class BDA : IInterface { public IDictionary GetData() { return new Dictionary() { { 0, new B() } }; } }
public class MyClass { public static void Fill(params IInterface[] @interface) { foreach (var access in @interface) access.GetData(); } }
Он не компилируется, вопрос такой: Как можно передать несколько реализаций интерфейса IInterface в метод Fill ? Есть разные способы, хочется узнать какой правильный. Если ошибка в проектировании, подскажите пожалуйста как будет верно ? Классы Base, A, B изменять нежелательно.


Ответ

Т.к. строгой типизации все равно не получить, то есть несколько вариантов:
dynamic:
public static void Fill(params dynamic[] interfaces) { foreach (var access in interfaces) { object data = access.GetData(); } } dynamic с маркер-интерфейсом:
public interface IInterface { }
public interface IInterface : IInterface { IDictionary GetData(); }
public static void Fill(params IInterface[] interfaces) { foreach (dynamic access in interfaces) { object data = access.GetData(); } } Реальный интерфейс с неявной реализацией в ADA и BDA
public interface IInterface { IDictionary GetData(); }
public interface IInterface : IInterface { new IDictionary GetData(); }
public class BDA : IInterface { public IDictionary GetData() { return new Dictionary() { { 0, new B() } }; }
IDictionary IInterface.GetData() { return (IDictionary)this.GetData(); } }
public static void Fill(params IInterface[] interfaces) { foreach (var access in interfaces) { IDictionary data = access.GetData(); } }
В последнем случае типизация какая-никакая будет. В первых двух - object.

Комментариев нет:

Отправить комментарий