23

我目前正在深入研究 C# 的第二版,并尝试实现“动态协议缓冲区”——即在我现有的协议缓冲区库之上的动态支持级别。因此,我有一个DlrMessage派生自DynamicObject. 在玩了一点之后,我设法让它以非常少的代码响应简单的属性,但我想走得更远 - 并真正了解发生了什么。

到目前为止,我还没有找到对 DLR 的任何好的解释——而且很多博客文章现在实际上已经过时了,因为在以前的 CTP 和 .NET 4.0 beta 1 之间发生了变化(我相信)。MSDN 文档对于 DynamicObject目前非常少。

我最直接的疑问是是否有一种简单的说法,“使用反射来绑定我无法处理的任何调用,使用这个特定的对象。” (换句话说,如果可能的话,我想增加现有的反射绑定,而不是自己做所有事情。)不幸的是,我并没有靠猜测走得太远。

是否有任何我应该知道的明确和最新的文档来源?我知道关于新技术的部分写作探索,但我们将不胜感激:)

4

3 回答 3

23

我发现并经常阅读的最佳来源是 Chris Burrow 在他的博客上发表的最后几年的文章。

还有官方 DLR 文档页面,该页面位于DLR 主站点之外。

于 2009-05-31T17:52:19.470 回答
5

我目前也在研究这个,还没有太多信息。我无法帮助您查询,但以下是我找到的一些信息:

PDC 视频中有相当数量的内容。

http://channel9.msdn.com/pdc2008/TL44/

http://channel9.msdn.com/pdc2008/TL10/

本文讨论了 DLR 如何与 IronPython 一起工作:http: //msdn.microsoft.com/en-us/magazine/cc163344.aspx

培训工具包预览中的数量非常少,网址为:http: //www.microsoft.com/downloads/details.aspx? FamilyID=752cb725-969b-4732-a383-ed5740f02e93&displayLang=en

希望这可以帮助

亚历克斯

于 2009-05-31T18:11:42.420 回答
3

默认情况下,如果您的 Try* 函数返回 false,DynamicObject 会说“回退到反射”。因此,如果动态路径不进行查找,您已经可以继承并向子类添加属性/字段/方法,所有这些都将由反射处理。

更深入地了解您可能需要查看 IDynamicMetaObjectProvider。在这个较低级别,您所说的回退到反射的方式是在传入的 DynamicMetaObjetBinder 上调用 Fallback* 方法。然后,这让调用语言提供解决方案。然后,您可以返回该 AST 或将其组合成您返回的更大的 AST。基本上 Fallback* 让您获得调用语言将产生的 AST,包括正确的错误(异常、在 JS 中未定义等)。

DynamicObject 回退到反射的方式是它实际上调用了活页夹的 Fallback* 方法两次。第一次回退时没有“errorSuggestion”参数。这会得到错误或使用反射构建的 AST。然后它会产生一个 AST,类似于:

if(TryGetMember("name", out value)) {
   return value;
} else {
   return resultOffallback;
}

然后,它采用这个组合的 AST 并将其作为第二次回退的 binder 的错误建议提交。如果绑定不成功,则绑定器应遵守此错误建议。但是,如果存在 .NET 成员,则会丢弃 errorSuggestion 并优先使用 .NET 绑定。最后,如果该语言不知道绑定是否成功(例如,该语言具有“方法缺失”类型特征),它可以再次将 AST 与它的动态检查结合起来。所以使用 Fallback 你不仅可以说做反射,还可以选择动态或静态成员优先。

于 2009-05-31T23:40:12.593 回答