C# 什么';是DLR(.NET 4.0 beta 1)上最好的信息来源吗?

C# 什么';是DLR(.NET 4.0 beta 1)上最好的信息来源吗?,c#,dynamic,c#-4.0,dynamic-language-runtime,C#,Dynamic,C# 4.0,Dynamic Language Runtime,我目前正在深入研究C#的第二版,并试图实现“动态协议缓冲区”——即在我现有的协议缓冲区库之上的动态支持级别。因此,我有一个从DynamicObject派生的DlrMessage类型。在玩了一会儿之后,我设法让它用非常少的代码来响应简单的属性,但我想做得更进一步,真正理解发生了什么 到目前为止,我还没有找到任何关于DLR的好的解释,而且很多博客文章实际上已经过时了,因为在以前的CTP和.NET4.0Beta1之间情况已经发生了变化(我相信)。目前的风险非常小 我最直接的问题是,是否有一种简单的方式

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

到目前为止,我还没有找到任何关于DLR的好的解释,而且很多博客文章实际上已经过时了,因为在以前的CTP和.NET4.0Beta1之间情况已经发生了变化(我相信)。目前的风险非常小

我最直接的问题是,是否有一种简单的方式可以说,“使用反射绑定任何我无法处理的调用,使用这个特定的对象。”(换句话说,如果可能的话,我想扩展现有的反射绑定,而不是自己做每件事。)不幸的是,我的猜测并没有走多远


是否有我应该知道的明确的和最新的文档来源?我知道写一项新技术的一部分是探索,但如果你能伸出援手,我将不胜感激:)

我发现并经常阅读的最好的资料来源是克里斯·巴罗最近几年发表的文章


还有一个是关闭的。

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

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

本文讨论DLR如何与IronPython配合使用:

在以下位置的培训包预览中有少量内容:

希望这有帮助


Alex

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

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

DynamicObject回退到反射的方式是,它实际上调用绑定器的fallback*方法两次。第一次返回时没有“errorSuggestion”参数。这将获取错误或使用反射生成的AST。然后生成一个AST,类似于:

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

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

请看,这里我以为您指的是Docklands轻轨。:)以重复的方式结束克莱特斯的笑话:;)哦,这看起来很方便,谢谢-我特别喜欢这一切都是最近的:)图书馆作者的介绍看起来好像是对的。这就是你的问题。“…最近的文件来源…”:)Jon Skeet接受答案时有徽章吗?谢谢。DynamicObject的问题是它会退回到这个对象上的反射——我希望它退回到另一个对象上的反射,我怀疑要使它正常工作,我必须实现IDynamicMetaObjectProvider,这在本例中比它的价值要麻烦得多。最后,我将一堆方法复制到我的动态类型中,而动态类型只是代理到另一个对象上,所以我仍然可以得到反射的好处。难看,但它可以工作。@Jon Skeet您可以编写一个简单的T4文件,在一个分部类中很容易地为任何对象编码此适配器模式。如果你问这样的问题,我会为你发布一个解决方案!