在 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.Emails
、contact.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]
或其他类似列表的操作,这意味着编写这样的序列化程序是非常有可能的。
在 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.Emails
、contact.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]
或其他类似列表的操作,这意味着编写这样的序列化程序是非常有可能的。