在UWP中:Contact.Phones属性不返回IList<;联络电话>;如文件所述

在UWP中:Contact.Phones属性不返回IList<;联络电话>;如文件所述,uwp,windows-10,win-universal-app,windows-10-universal,Uwp,Windows 10,Win Universal App,Windows 10 Universal,在UWP应用程序中,我使用 var contactPicker=new Windows.ApplicationModel.Contacts.contactPicker(); Contact Contact=等待contactPicker.PickContactAsync() 然后,我使用以下命令序列化返回的联系人对象: string c=JsonConvert.serialized对象(contact) 但问题是联系人对象中的属性(应该)类型为IList,例如电话、电子邮件、地址。。。etc未正

在UWP应用程序中,我使用

var contactPicker=new Windows.ApplicationModel.Contacts.contactPicker();
Contact Contact=等待contactPicker.PickContactAsync()

然后,我使用以下命令序列化返回的联系人对象:

string c=JsonConvert.serialized对象(contact)

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

经过检查,我发现问题在于这些属性并没有像预期的那样返回实现接口
IList
的类的对象!相反,它们返回类型为
System.\u ComObject
的对象。 因此,当调用
contact.Phones.GetType().FullName
时,我得到:
System.\u ComObject

联系人.电子邮件
联系人.地址
。。。等等


是否有助于正确获取属性,从而正确序列化contact对象?

大多数UWP类型实际上都是隐藏的COM对象。有一些魔法可以让它们出现并充当它们声称的C#投影,但如果你试图用反射(就像JSON.NET那样)做事情,现实就会露出丑陋的头颅

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

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


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

大多数UWP类型实际上都是隐藏在引擎盖下的COM对象。有一些魔法可以让它们出现并充当它们声称的C#投影,但如果你试图用反射(就像JSON.NET那样)做事情,现实就会露出丑陋的头颅

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

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

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