首页 > 解决方案 > 在 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... 等也是如此。

对正确获取属性并因此正确序列化联系人对象有任何帮助吗?

标签: uwpwindows-10win-universal-appwindows-10-universal

解决方案


大多数 UWP 类型实际上是底层的 COM 对象。有一些魔法可以让它们出现并充当它们声称的 C# 投影,但是如果您尝试使用反射(如 JSON.NET 所做的那样)来做事,那么现实就会出现丑陋的一面。

一些快速测试揭示了两种可能的选择:

1) 强制从返回的值contactPicker.PickContactsAsync()到一个真正的 C# 对象可以通过 LINQ .ToList()(或者.ToArray(),我想是)调用运行它来完成。您必须为每个Contact对象上的每个集合属性执行此操作,但最后,您将拥有一个愉快的可序列化 C# 对象。

Contact2) 为了解如何单独访问和序列化每个属性的对象编写自己的 JSON.NET 序列化程序。如果您执行类似的操作var singleContact = await contactPicker.pickContactAsync(),您仍然可以singleContact.Addresses[0]按照您在 C# 代码中所期望的方式执行或其他类似列表的操作,这意味着编写这样的序列化程序是非常可能的。


推荐阅读