Dynamic C#4.0动态对象是否有一些用于duck类型的工具?

Dynamic C#4.0动态对象是否有一些用于duck类型的工具?,dynamic,c#-4.0,duck-typing,Dynamic,C# 4.0,Duck Typing,Anders说,在C#4.0中,我们将得到动态类型,或者“静态类型是动态的”对象。这将允许在运行时而不是编译时进行任何方法调用解析。但是,是否有一种工具可以将动态对象绑定到某种契约(从而也可以为它获取完整的intellisense),而不是允许对它进行任何调用,即使您知道这可能是无效的 也就是说,不只是 dynamic foo = GetSomeDynamicObject(); 能够强制转换或转换它以将其约束到已知契约,例如 IFoo foo2 = foo.To<IFoo>; 在

Anders说,在C#4.0中,我们将得到动态类型,或者“静态类型是动态的”对象。这将允许在运行时而不是编译时进行任何方法调用解析。但是,是否有一种工具可以将动态对象绑定到某种契约(从而也可以为它获取完整的intellisense),而不是允许对它进行任何调用,即使您知道这可能是无效的

也就是说,不只是

dynamic foo = GetSomeDynamicObject();
能够强制转换或转换它以将其约束到已知契约,例如

IFoo foo2 = foo.To<IFoo>;

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

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

这是个很酷的主意。 如果我理解您的意思,您正在描述/建议CLR的一种功能,当您尝试将动态对象强制转换到接口时,它应该查看动态对象支持哪些方法/属性,并查看是否有有效实现该接口的方法/属性。然后CLR将负责在对象上“实现IFoo”,这样您就可以将动态对象强制转换为IFoo。
几乎可以肯定这将不受支持,但这是一个有趣的想法。

Tobias Hertkorn通过一个链接回答了我的问题,该链接显示了如何在MetaObject上使用Convert()方法返回动态代理的示例。它看起来很有希望。

它与“实现IFoo”无关,因为它仍然是一个动态对象,即调用仍然会在运行时发生,但现在可以将其作为IFoo传递,因为您告诉编译器您的动态对象的行为类似于IFooYes,但如果您希望IFoo传递,“某人”需要编写一个passthrough IFoo实现,其背后有动态对象。这就是Jon Skeet在上面所说的。如果你愿意用Python或Ruby编写shim,今天就可以很容易地实现它。这篇文章很有趣,但实际上是Castle的DynamicProxy,我今天用它来创建“duck”类型,所以dynamic似乎没有给这里的聚会带来任何东西。我希望dynamic能消除我对DynamicProxy的需求
IFoo foo2 = foo as IFoo;