代码之家  ›  专栏  ›  技术社区  ›  Jon Skeet

DLR(.NET 4.0 Beta 1)的最佳信息源是什么?

  •  21
  • Jon Skeet  · 技术社区  · 17 年前

    我目前正在深入研究C的第二版,并尝试实现“动态协议缓冲区”——即在我现有的协议缓冲库之上的动态支持级别。因此,我有一个 DlrMessage 派生自的类型 DynamicObject . 在玩了一会儿之后,我设法让它用非常少的代码响应简单的属性,但是我想做得更深入一些——并且真正了解正在发生的事情。

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

    我最直接的问题是,是否有一种简单的说法,“使用反射绑定我无法处理的任何调用,使用这个特定的对象。”(换句话说,如果可能的话,我希望增强现有的反射绑定,而不是自己做任何事。)不幸的是,我没有太多的猜测。

    是否有我应该知道的文件的确定和最新来源?我知道写新技术的那部分内容 探索,但一只援助之手将不胜感激:)

    3 回复  |  直到 17 年前
        1
  •  23
  •   TheSoftwareJedi jac    17 年前

    我发现并经常阅读的最好的信息来源是克里斯·伯罗过去几年发表的文章。 his blog .

    还有 official DLR documentation page 哪个关了 main DLR site .

        2
  •  5
  •   alexmac    17 年前

    我现在也在研究这个,还没有太多的信息。我帮不了你的问题,但我发现以下是一些信息:

    在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

    希望这有帮助

    亚历克斯

        3
  •  3
  •   Dino Viehland    17 年前

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

    更深入地讲,您可能希望了解idynamicMetaObjectProvider。在这个较低的级别上,您说回退到反射的方式是对传入的dynamicmetaobjetBinder调用回退*方法。然后让调用语言提供解决方案。然后,您可以返回该AST或将其组合成一个更大的AST,无论您返回什么。基本上,回退*让您得到调用语言将产生的AST,包括正确的错误(异常、JS中未定义等)。

    DynamicObject对反射进行回退的方式是,它实际上调用了绑定器的回退*方法两次。第一次在没有“errorSuggestion”参数的情况下返回。这将获取使用反射构建的错误或AST。然后生成一个ast,类似于:

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

    然后,它接受这个组合的AST,并实际将其作为第二个回退的活页夹的错误建议提交。如果绑定失败,绑定器应该遵守这个错误建议。但如果存在.NET成员,则会丢弃错误建议,并优先使用.NET绑定。最后,如果语言不知道绑定是否成功(例如,语言具有“方法缺失”类型特性),它可以再次结合ASTS和它的动态检查。因此,使用回退,您不仅可以说做反射,还可以选择动态成员还是静态成员优先。

    推荐文章