C# NancyFx动态图像

C# NancyFx动态图像,c#,dynamic,nancy,propertybag,C#,Dynamic,Nancy,Propertybag,我正在努力理解NancyFX中的DynamicDictionary,它看起来很酷。有人知道一篇博文或类似的文章,它贯穿于文章的内部吗 我需要一个propertybag来传递对象,我不知道对象的内容,因为它们作为JSON来自我的系统之外。但是基于这些对象的内容,比如某些属性的存在,我需要做一些事情 我可以只传递动态对象,但我认为这有点太模糊了。我真的不喜欢那样 我需要嵌套字典,以完全表示对象图。动态字典只是一个带有字典的ExpandooObject。因此,它仍然可以像字典一样访问 例如,在MVC中

我正在努力理解NancyFX中的DynamicDictionary,它看起来很酷。有人知道一篇博文或类似的文章,它贯穿于文章的内部吗

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

我可以只传递动态对象,但我认为这有点太模糊了。我真的不喜欢那样


我需要嵌套字典,以完全表示对象图。

动态字典只是一个带有字典的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;
}