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