C# NancyFx动态图像
我正在努力理解NancyFX中的DynamicDictionary,它看起来很酷。有人知道一篇博文或类似的文章,它贯穿于文章的内部吗 我需要一个propertybag来传递对象,我不知道对象的内容,因为它们作为JSON来自我的系统之外。但是基于这些对象的内容,比如某些属性的存在,我需要做一些事情 我可以只传递动态对象,但我认为这有点太模糊了。我真的不喜欢那样C# NancyFx动态图像,c#,dynamic,nancy,propertybag,C#,Dynamic,Nancy,Propertybag,我正在努力理解NancyFX中的DynamicDictionary,它看起来很酷。有人知道一篇博文或类似的文章,它贯穿于文章的内部吗 我需要一个propertybag来传递对象,我不知道对象的内容,因为它们作为JSON来自我的系统之外。但是基于这些对象的内容,比如某些属性的存在,我需要做一些事情 我可以只传递动态对象,但我认为这有点太模糊了。我真的不喜欢那样 我需要嵌套字典,以完全表示对象图。动态字典只是一个带有字典的ExpandooObject。因此,它仍然可以像字典一样访问 例如,在MVC中
我需要嵌套字典,以完全表示对象图。动态字典只是一个带有字典的ExpandooObject。因此,它仍然可以像字典一样访问 例如,在MVC中,您可以访问如下表单属性:
var name=Request[“name”];
或
当一个请求进入Nancy时,您可以通过点符号访问它。或者通过类索引器
var name = parameters.name;
var name = parameters["name"];
当您发送的查询字符串或表单名称的值不能在点表示法中使用时,这非常方便
var firstName = parameters["first-name"];
这些值也是动态的,因此可以由嵌套对象组成。这允许您执行以下操作:
var firstName = parameters.contact.firstname;
因此,如果要向请求传递JSON负载,那么可以使用点表示法访问整个结构
但是,您可能会发现大多数使用Nancy的开发人员仅使用此方法访问路由值或查询字符串值
Get["/products/{id:int}/"] = parameters => {
int id = parameters.id;
};
回到原来的问题:
有没有博客帖子或任何文档
它为什么存在:对于sugar语法
我可以用它做我想要的吗:是的,绝对可以
你能告诉我如何使用它吗:不,不过它应该不难。看看Nancy的模型绑定就知道了。这不太难
只是根据OP的答案进行编辑 当您访问点表示法时,继续点表示法将只适用于进一步的动态类型 这意味着使用
var
将导致异常,因为编译器处理var
和dynamic
的方式不同
当您这样做时:
var person = parameters.person;
var name = person.name;
参数
当前是动态的
并实现了TryGetMember
,这将在内部查找值字典并尝试返回值
将对象定义为person
变量的var
时。编译器假定对象上存在其后的任何内容,因此它在person
变量上查找name
由于name
不作为person
的成员存在,它将抛出
要解决此问题,必须将变量指定为动态
。因此,这个例子变成:
dynamic person = parameters.person;
var name = person.name;
这会有用的。所以我开始使用DynamicDictionary,它非常酷,而且很容易使用。现在只有一件事让我心烦。这就是如果我嵌套DynamicDictionary 请看以下示例:
private void TestNestedDynamicDictionary()
{
dynamic dictionary = new DynamicDictionary();
dynamic nestedDictionary = new DynamicDictionary();
nestedDictionary.Add("name", "Peter");
dictionary.Add("person", nestedDictionary);
var person = dictionary.person;
var name = person.name;
Console.WriteLine(name);
}
尝试使用Microsoft.CSharp.RuntimeBinder.RuntimeBinderException访问person.name
时,此操作失败:
DynamicDictionaryValue' does not contain a definition for 'name'
如果我只是这样做一个显式的演员阵容,它的工作
var person = (DynamicDictionary)dictionary.person;
任何关于我如何让它表现为动态图片的输入都是开箱即用的。。。除了在返回DynamicDictionaryValue之前检查它之外,还要在那里进行转换,我认为这很混乱
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
object value;
if (!dictionary.TryGetValue(binder.Name, out value))
{
result = new DynamicDictionaryValue(null);
return true;
}
var dictVal = value as DynamicDictionaryValue;
if (null != dictVal && dictVal.Value is DynamicDictionary)
{
result = dictVal.Value;
}
else
{
result = value;
}
return true;
}
你查过了吗?是的,我查过了。。。它似乎完成了任务。我只是想了解一下它的用途。如果它不是为了解决我的问题,我不想使用它。谢谢菲尔!我也这么想,昨晚玩了一整晚。我没有创建嵌套的动力学,而是将对象嵌套为DynamicDictionary,这样就可以得到嵌套的字典。这让我有点头疼,因为我必须将它从动态转换为动态,才能将它真正用作动态。我来看看模型绑定。NancyFx的代码结构非常好,易于阅读。印象深刻!因为
var
不是动态的。如果您将代码更改为dynamic person=dictionary.person
然后您可以访问person.name
:)TryGetMember
仅适用于定义为动态
的类型,当您使用var
时,它不会这样做。当然。。。为什么我没看到呢。但是如果我想使用dictionary部分,而不是访问键集合,那么我必须将它转换为DynamicDictionary。或者我可以只访问对象上的.Value,这也会给我DynamicDictionary。但我想一个明确的演员阵容能更好地解释发生了什么。
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
object value;
if (!dictionary.TryGetValue(binder.Name, out value))
{
result = new DynamicDictionaryValue(null);
return true;
}
var dictVal = value as DynamicDictionaryValue;
if (null != dictVal && dictVal.Value is DynamicDictionary)
{
result = dictVal.Value;
}
else
{
result = value;
}
return true;
}