【问题标题】:Converting type of a property of a DynamicObject based on ReturnType根据 ReturnType 转换 DynamicObject 的属性类型
【发布时间】:2016-03-05 15:12:38
【问题描述】:

我在 C# 中有一个动态类型(Content,一种继承 DynamicObject 的类型)。它包装了一个包含数据的内部 JSON 对象。在 TryGetMember 中,我从这个内部 JSON 对象返回请求的属性。这在简单类型(例如 int 或 string 属性)的情况下工作得很好,因为 .Net 正确地转换了这些值。

但我想使用更复杂类型的属性:

dynamic content = Content.Load(id); 
IEnumerable<Book> bookList = content.Books;

问题在于,在我的班级的 TryGetMember 中,我无法知道应该转换为的类型(在本例中为 IEnumerable Book),因为 binder.ReturnType 总是对象。根据这篇文章,这是正常行为: Determining the expected type of a DynamicObject member access

但我觉得这很难相信:API 怎么可能不让我知道目标类型?这样我将不得不强制开发人员使用方法语法来明确指定类型:

IEnumerable<Books> bookList = content.Books<IEnumerable<Book>>();

...丑陋而奇怪。

【问题讨论】:

    标签: c# dynamic types properties dynamicobject


    【解决方案1】:

    您可以将 Type 数据与 JSON 序列化数据一起存储,但这似乎是完成您想要做的事情的一种相当低效的方法。如果您的内容不是真正动态的(例如,内容发生了变化,但对象的基本架构是相同的),您可以只为每个 JSON 对象类型预编译类,然后序列化 JSON收到数据后进入该类。这样,编译器在运行时就可以识别所有类型数据。

    【讨论】:

    • 不幸的是,数据来自服务器并且是真正动态的。只有调用者知道某个属性是某种类型的可枚举。不过感谢您的快速回答!
    【解决方案2】:

    事实证明,这确实是不可能的。我最终创建了一个扩展方法(以两种形式定义:用于动态集合和 JArray)。这样我至少可以获得我的 Content 类的集合,并且以下所有解决方案都有效:

    一行,但有点长

    var members = ((IEnumerable<dynamic>)group.Members).ToContentEnumerable();    
    

    分隔线

    IEnumerable<dynamic> members = adminGroup.Members;
    foreach (dynamic member in members.ToContentEnumerable())
    {
        //...
    }
    

    使用扩展方法的方法调用语法(有点不寻常)。

    var members = ContentExtensions.ToContentEnumerable(group.Members);
    

    【讨论】:

      猜你喜欢
      • 2015-11-25
      • 1970-01-01
      • 2014-10-29
      • 2013-12-02
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多