После того, как я посмотрел, как Go обрабатывает интерфейсы, и мне это понравилось, я начал думать о том, как можно добиться подобного утиного набора текста на C #, например это:
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: очевидно, правильным термином для того, что я называю "безопасный набор текста", является структурный печатать.