Имеется такой код:
public interface IInterface
public class Base
{
}
public class A: Base
{
}
public class B : Base
{
}
public class ADA: IInterface
{
public IDictionary
public class BDA : IInterface
{
public IDictionary
public class MyClass
{
public static void Fill(params IInterface
Он не компилируется, вопрос такой: Как можно передать несколько реализаций интерфейса 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
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
public class BDA : IInterface
{
public IDictionary
IDictionary IInterface.GetData()
{
return (IDictionary)this.GetData();
}
}
public static void Fill(params IInterface[] interfaces)
{
foreach (var access in interfaces)
{
IDictionary data = access.GetData();
}
}
В последнем случае типизация какая-никакая будет. В первых двух - object.
Комментариев нет:
Отправить комментарий