在 UWP 中:Contact.Phones 属性 不 return IList<ContactPhone> 如文档中所述

In UWP: Contact.Phones property does not return IList<ContactPhone> as stated in the docs

在 UWP 应用程序中,我正在使用

选择联系人

var contactPicker = new Windows.ApplicationModel.Contacts.ContactPicker(); Contact contact = await contactPicker.PickContactAsync();

然后我使用 Json.NET 序列化 returned 联系人对象,如下所示:

string c = JsonConvert.SerializeObject(contact);

但问题是联系人对象中(应该是)IList 类型的属性(例如电话、电子邮件、地址...等)未正确序列化。它们是空 JSON 数组。

检查后,我发现问题是这些属性不是 returning 对象 类 实现接口 IList 所设想的!相反,它们 return 类型 System._ComObject 的对象。 所以当调用 contact.Phones.GetType().FullName 时,我得到:System._ComObject.

contact.Emailscontact.Addresses ...等也一样

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

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

一些快速测试揭示了两个可能的选项:

1) 将 contactPicker.PickContactsAsync() 返回的值强制转换为真正的 C# 对象可以通过 运行 通过 LINQ .ToList()(或 .ToArray(),我想) 称呼。您必须为每个 Contact 对象上的每个集合 属性 执行此操作,但在它结束时,您将拥有一个愉快的可序列化 C# 对象。

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