NancyFx DynamicDictionary

Jay*_*ete 3 c# dynamic propertybag nancy

我试图理解NancyFX中的DynamicDictionary,它看起来很酷.有没有人知道一篇博文或类似文章,它是通过内部的?

我需要一个propertybag来传递对象,我不知道它们的内容,因为它们来自我的系统之外的JSON.但是基于这些对象的内容,比如我需要做某些属性的存在.

我可以绕过动态对象,但我认为这有点过于模糊.真的不喜欢那样.

我需要嵌套字典,以完全代表对象图.

Phi*_*ill 7

动态字典只是一个包含字典的ExpandoObject.所以仍然可以像字典一样访问它.

例如,在MVC中,您可以访问表单属性,如下所示:

var name = Request["name"];
Run Code Online (Sandbox Code Playgroud)

要么

var name = Request.Form["name"];
Run Code Online (Sandbox Code Playgroud)

当请求进入Nancy时,您可以通过点表示法访问它.或者通过类索引器.

var name = parameters.name;
var name = parameters["name"];
Run Code Online (Sandbox Code Playgroud)

当您发送具有不能以点表示法使用的值的查询字符串或表单名称时,这很方便.

var firstName = parameters["first-name"];
Run Code Online (Sandbox Code Playgroud)

这些值也是动态的,因此它可以由嵌套对象组成.这允许你做以下的事情:

var firstName = parameters.contact.firstname;
Run Code Online (Sandbox Code Playgroud)

因此,如果您将JSON有效负载传递给请求,则可以使用点表示法访问整个结构.

但是,您可能会发现大多数使用Nancy的开发人员只能使用此方法访问Route值或QueryString值.

Get["/products/{id:int}/"] = parameters => {
   int id = parameters.id;
};
Run Code Online (Sandbox Code Playgroud)

回到最初的问题:

有博客文章或任何doco:没有.

它为什么存在:对于糖语法.

我可以将它用于我想要的东西:绝对是!

你能告诉我如何使用它:不,但它应该不难.只要看看南希的模型绑定就可以搞清楚.这不是太难.


只是根据OP的答案进行编辑.

当您访问点表示法时,续点符号将仅适用于其他动态类型.

这意味着使用var会因为方式var而导致异常,dynamic并由编译器处理.

当你这样做时:

var person = parameters.person;
var name = person.name;
Run Code Online (Sandbox Code Playgroud)

parameters当前dynamic和实现TryGetMember,这内部查找值的字典并尝试返回值.

varperson变量定义对象时.编译器假定对象之后存在任何内容,因此它nameperson变量上查找.

既然name不存在就会成为person它的一员.

要解决此问题,必须将变量指定为dynamic.所以这个例子变成了:

dynamic person = parameters.person;
var name = person.name;
Run Code Online (Sandbox Code Playgroud)

这会奏效.