Как может класс быть разработан, чтобы издеваться над неизвестным типом? - PullRequest
3 голосов
/ 03 сентября 2010

Я видел примеры этого, где интерфейс предоставляется фабрике, и он генерирует объекты, которые реализуют интерфейс. Это не так сложно для меня, но я не понимаю, как это можно использовать для реализации поведения.

Например, ChannelFactory в WCF ... когда вы генерируете канал из интерфейса, он предоставляет методы (из интерфейса), которые при вызове вызывают удаленные процедуры. Кажется, у меня небольшой пробел в моих знаниях о том, как это можно сделать. Вероятно, это общий шаблон проектирования, но я решил, что снова буду использовать SO в качестве исследовательского расширения.

Ответы [ 2 ]

1 голос
/ 03 сентября 2010

Обычно происходит через эмиссию кода.См. Классы в System.Reflection.Emit.

Например, вы можете получить интерфейс типа и просмотреть методы, которые он объявляет, затем создать свой собственный тип, который его наследует, используя TypeBuilder, и реализовать любые функции, которые выжелание в методах (или просто их сделать пустыми / сделать возврат по умолчанию (T)), используя MethodBuilder и так далее, пока вы не удовлетворите интерфейс.

1 голос
/ 03 сентября 2010

Моделирующие фреймворки, которые имитируют интерфейс, генерируют динамический класс, который реализует интерфейс.Поведение смоделированного метода (ов) будет зависеть от структуры.Как правило, метод ничего не будет делать, если реализация не предоставлена ​​через макет.

Например:

Mock<IRepository> repMock = new Mock<IRepository>();
repMock.Setup(r => r.FindById(1)).Returns(new MyObject());

При условии, что интерфейс IRepository определяет метод FindByID, Setup метод макета динамически генерирует реализацию метода и «внедряет» его в макет.Это делается с помощью Reflection.Emit, который можно использовать для динамического построения инструкций IL и их компиляции на лету.

...