DLR (.NET 4.0 beta 1)最好的信息来源是什么?

23

我目前正在研究C#深度第二版,并尝试实现“动态协议缓冲区”--即在我现有的协议缓冲库之上实现一定级别的动态支持。因此,我有一个从DynamicObject派生出的DlrMessage类型。经过一番摸索,我已经成功用很少的代码使它对简单属性作出反应,但我想更进一步--并真正理解发生了什么。

到目前为止,我还没有找到任何关于DLR的好的解释--而且很多博客文章实际上已经过时了,因为在以前的CTP和.NET 4.0 beta 1之间进行了更改(我相信)。目前DynamicObject的MSDN文档非常简略。

我最迫切的问题是是否有一种简单的方法来说,“使用反射绑定我无法处理的任何调用,使用这个特定的对象”(换句话说,如果可能的话,我想增强现有的反射绑定而不是自己做所有的事情)。不幸的是,我猜测也猜不出什么结果。

是否有任何权威且最近的文档来源我应该知道?我知道写关于新技术的一部分是探索,但希望得到帮助 :)


5
我以为你指的是伦敦轻轨道交通(Docklands Light Railway)。 :) - cletus
10
将Cletus的笑话作为重复内容关闭:https://dev59.com/hUbRa4cB1Zd3GeqP4unm ;) - Jon Skeet
3个回答

23

1
哦,那看起来非常方便,谢谢 - 我特别喜欢它全部都是最新的 :) "库作者介绍" 看起来就是完全正确的东西。 - Jon Skeet
36
好的,那确实是你的问题。 "...最近文档的来源..." :) 如果Jon Skeet接受了我的答案,是否有徽章可以获得? - TheSoftwareJedi

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

希望这有所帮助。

Alex


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 作为第二次回退时绑定器的错误提示信息。如果绑定不成功,绑定器应该尊重这个错误提示信息。但是,如果 .NET 成员存在,那么错误提示信息会被抛弃,而 .NET 绑定会优先执行。最后,如果语言不知道绑定是否成功(比如语言有一个“方法缺失”类型的特性),它可以再次结合 AST 和其动态检查。因此,使用回退机制,您不仅可以说反射,还可以选择动态或静态成员优先。


1
问题在于DynamicObject会回退到对this对象的反射 - 我希望它能够回退到对不同对象的反射,并且我怀疑为了使其工作,我必须实现IDynamicMetaObjectProvider,但在这种情况下,这更麻烦而不值得。最终,我将一堆方法复制到我的动态类型中,这些方法只是代理到其他对象,因此我仍然可以获得反射的好处。很丑,但它起作用。 - Jon Skeet
1
@Jon Skeet 您可以编写一个简单的 T4 文件,在部分类中轻松地为任何对象生成适配器模式的代码。如果您提出这样的问题,我会为您发布一个解决方案! - TheSoftwareJedi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接