我目前正在深入研究 C# 第二版,并尝试实现“动态协议缓冲区” - 即在我现有的协议缓冲区库之上提供一定程度的动态支持。因此,我有一个 DlrMessage 类型源自 DynamicObject. 。经过一番尝试后,我设法让它用很少的代码来响应简单的属性,但我想走得更远 - 并真正了解发生了什么。

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

我最直接的查询是是否有一种简单的方式说:“使用反射来绑定我无法处理的任何呼叫,使用此特定对象。” (换句话说,我想增加现有的反射绑定,而不是自己做所有事情。

是否有我应该了解的明确且最新的文档来源?我知道撰写有关新技术的部分内容 探索,但我们将不胜感激:)

有帮助吗?

解决方案

我发现,经常阅读的最佳来源是值得克里斯·伯罗对他的博客

另外还有官方DLR文档页面其是关闭主DLR网站

其他提示

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

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

希望这可以帮助

亚历克斯

默认情况下DynamicObject会说:“退回到反思”如果你尝试*函数返回false。所以,你已经可以继承和属性/字段/方法添加到您的子类,都将通过反射来处理,如果动态路径没有做查找。

在深入去越多,你可能想看看IDynamicMetaObjectProvider。在这个较低的水平,你说回退到反射的方法是调用传入DynamicMetaObjetBinder回退*方法。这样将会使主叫语言提供的分辨率。然后,您可以返回AST或将其组合成whcih返回一个更大的AST。基本上后备*让你的通话语言会产生包括正确的错误的AST(例外,不确定的JS,等...)。

DynamicObject确实回退到反射的方式是,它实际上调用粘合剂的回退*方法的两倍。第一次就后退没有“errorSuggestion”参数。这得到任何错误或使用反射建造的AST。然后,它产生一个AST其是这样的:

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

然后,它需要该组合AST和实际手它在作为用于在第二回退粘合剂中的错误的建议。然后,粘合剂应该尊重这个errorSuggestion如果绑定不成功。但是,如果.NET构件存在,则errorSuggestion被丢弃和.NET结合优先。最后,如果语言不知道如果绑定成功(例如语言有一个“方法失踪”型功能),它可以在AST的再次结合瓦特/它的动态检查。因此,使用回退,你不仅可以说做的反射也可以选择动态或静态成员是否优先。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top