C#4.0动态对象是否具有一些鸭子打字功能?

时间:2008-11-03 20:56:12

标签: dynamic c#-4.0 duck-typing

根据Anders的说法,在C#4.0中,我们将获得动态类型或“静态类型是动态的”对象。这将允许任何方法调用解析在运行时而不是编译时发生。但是,是否有设施将动态对象绑定到某种合同上(从而也可以获得完整的智能感知),而不是允许对它进行任何调用,即使你知道它不可能有效。

即。而不只是

dynamic foo = GetSomeDynamicObject();

能够转换或转换它以将其约束为已知合约,例如

IFoo foo2 = foo.To<IFoo>;

甚至只是

IFoo foo2 = foo as IFoo;

在C#4.0的现有材料中找不到类似的东西,但它似乎是动态范例的逻辑扩展。有更多信息的人?

3 个答案:

答案 0 :(得分:2)

我不知道有什么东西真的像鸭子打字,我害怕。我blogged about the idea,但我不指望任何支持。使用Reflection.Emit创建一个类,它将生成任何给定接口的实现,在构造函数中获取动态对象并将每个调用代理到它,这可能不会太难。不理想,但它可能是一个权宜之计。

答案 1 :(得分:1)

这是一个很酷的主意。 如果我理解你,那么你正在描述/提出CLR的一个功能,当你尝试将动态对象转换为接口时,它应该查看动态对象支持哪些方法/属性,看看它是否具有有效实现该接口。然后CLR将负责对象的“实现IFoo”,因此您可以将动态对象转换为IFoo。 几乎可以肯定,这将不会得到支持,但这是一个有趣的想法。

答案 2 :(得分:1)

Tobias Hertkorn回答了我的问题here,其中包含指向blogpost的链接,其中显示了如何在MetaObject上使用Convert()方法返回动态代理的示例。看起来非常很有希望。