2008-11-03 30 views
5

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

I.e.而不是仅仅

dynamic foo = GetSomeDynamicObject(); 

要投或改造它把它限制在一个已知的合同只是

IFoo foo2 = foo as IFoo; 

无法找到任何东西的能力,如

​​3210

甚至就像现有C#4.0的材料一样,但它似乎是动态范例的逻辑延伸。有更多信息的人?

回答

2

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

1

这是一个很酷的想法。 如果我理解你,你正在描述/提出一个CLR的能力,当你尝试将一个动态对象投射到一个接口时,它应该查看动态对象支持哪些方法/属性并查看它是否具有有效实现该接口。然后,CLR将负责在对象上执行“IFoo”,然后您可以将动态对象投射到IFoo。 几乎可以肯定,这不会被支持,但这是一个有趣的想法。

+0

由于它仍然是一个动态对象,即调用仍然会在运行时发生,但您现在可以将它作为IFoo传递,因为您告诉编译器您的动态对象的行为类似于IFoo – 2008-11-03 21:57:17

+0

是的,但是如果你想让IFoo交出来,'有人'需要用它背后的动态对象来制作一个直通IFoo实现。这就是Jon Skeet上面提到的。 – mackenir 2008-11-03 22:59:10

1

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