uwp - 在 UWP 中:Contact.Phones 属性不返回 IList如文档中所述
问题描述
在 UWP 应用程序中,我正在使用
var contactPicker = new Windows.ApplicationModel.Contacts.ContactPicker();
Contact contact = await contactPicker.PickContactAsync();
然后我使用Json.NET序列化返回的联系人对象,如下所示:
string c = JsonConvert.SerializeObject(contact);
但问题是联系人对象中(应该是)类型的属性,IList
例如电话、电子邮件、地址......等没有正确序列化。它们是空的 JSON 数组。
经过检查,我发现问题在于这些属性没有返回实现接口的类的对象IList
!相反,它们返回类型为 的对象System._ComObject
。所以打电话时contact.Phones.GetType().FullName
,我得到:System._ComObject
。
contact.Emails
, contact.Addresses
... 等也是如此。
对正确获取属性并因此正确序列化联系人对象有任何帮助吗?
解决方案
大多数 UWP 类型实际上是底层的 COM 对象。有一些魔法可以让它们出现并充当它们声称的 C# 投影,但是如果您尝试使用反射(如 JSON.NET 所做的那样)来做事,那么现实就会出现丑陋的一面。
一些快速测试揭示了两种可能的选择:
1) 强制从返回的值contactPicker.PickContactsAsync()
到一个真正的 C# 对象可以通过 LINQ .ToList()
(或者.ToArray()
,我想是)调用运行它来完成。您必须为每个Contact
对象上的每个集合属性执行此操作,但最后,您将拥有一个愉快的可序列化 C# 对象。
Contact
2) 为了解如何单独访问和序列化每个属性的对象编写自己的 JSON.NET 序列化程序。如果您执行类似的操作var singleContact = await contactPicker.pickContactAsync()
,您仍然可以singleContact.Addresses[0]
按照您在 C# 代码中所期望的方式执行或其他类似列表的操作,这意味着编写这样的序列化程序是非常可能的。
推荐阅读
- c++ - 有 C++ 标准库 ifdef 或 ifndef 预处理器指令吗?
- entity-framework - 如何用 linq 排除孙子
- node.js - Angular,webpack:将项目构建到输出路径中
- php - 我的地图中有 x 和 y 坐标。x 的坐标是不同的标记并且有一个斜角。同样在 y 中。我怎样才能在下面的代码中做到这一点?
- firebase - 使用 Firebase Auth 对 IoT 设备进行身份验证
- reactjs - React Native - 选项卡导航器问题
- autocomplete - Monaco Editor 双倍空格产生句号
- excel - OnComm 事件不触发
- java - 未找到 Keytool 命令
- typescript - Ionic ModalPage 内容隐藏在滚动条上,不知道为什么