在C#中实现安全的duck-typing

Wim*_*nen 17 c# duck-typing adapter

在看了Go如何处理界面并喜欢它之后,我开始考虑如何在C#中实现类似的鸭子类型:

var mallard = new Mallard(); // doesn't implement IDuck but has the right methods
IDuck duck = DuckTyper.Adapt<Mallard,IDuck>(mallard);
Run Code Online (Sandbox Code Playgroud)

DuckTyper.Adapt方法将用于动态System.Reflection.Emit构建适配器.也许有人已经写过这样的东西了.我想它与模拟框架已经做的并没有太大的不同.

但是,如果Mallard实际上没有正确的IDuck方法,这将在运行时抛出异常.为了在编译时更早地得到错误,我必须编写一个MallardToDuckAdapter我正在努力避免的错误.

有没有更好的办法?

编辑:显然,我称之为"安全鸭子打字"的正确术语是结构打字.

dtb*_*dtb 13

如果你面前没有活着的呼吸牛,你怎么知道一头母牛像鸭子一样走路,像鸭子一样嘎嘎叫?

Duck-typing是在运行时使用的概念.编译时的类似概念是结构类型,它是CLR不支持的AFAIK.(CLR以主格打字为中心.)

[结构类型系统]与主格系统形成对比,主格系统的比较基于显式声明或类型名称,以及鸭子类型,其中仅检查在运行时访问的结构的一部分的兼容性.

确保duck-typing在运行时不会抛出异常的常用方法是单元测试.

  • 这正是结构继承的定义:-) (3认同)

Bob*_*Bob 5

针对C#的DuckTyping

Reflection.Emit用于发出直接调用原始对象的IL

我不认为这个库会给你编译时错误的想法,我不确定这是完全可行的.使用单元测试来帮助弥补这一点.

  • 根据Artistic License 2.0发布! (2认同)