Посмотрев на то, как Go обрабатывает интерфейсы и любит его, я начал думать о том, как вы могли бы добиться аналогичного утиного набора текста на С# это:
var mallard = new Mallard(); // doesn't implement IDuck but has the right methods
IDuck duck = DuckTyper.Adapt<Mallard,IDuck>(mallard);
Метод DuckTyper.Adapt
использовал бы System.Reflection.Emit
для создания адаптера "на лету". Может, кто-то уже написал что-то подобное. Я предполагаю, что это не слишком отличается от того, что уже издеваются над каркасами.
Однако это приведет к исключению во время выполнения, если Mallard
фактически не имеет правильных методов IDuck
. Чтобы получить ошибку раньше во время компиляции, мне пришлось бы написать MallardToDuckAdapter
, чего я пытаюсь избежать.
Есть ли лучший способ?
edit: по-видимому, правильным термином для того, что я называю "безопасным утиным типом", является структурная типизация.