在UWP中:Contact.Phones属性不返回IList 如文档中所述

问题描述 投票:0回答:1

在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.Emailscontact.Addresses ...等也相同

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

uwp windows-10 win-universal-app windows-10-universal
1个回答
0
投票

大多数UWP类型实际上是内部的COM对象。使它们显示并充当它们声称的C#投影有一些魔力,但是如果您尝试使用Reflection做事(如JSON.NET所做的那样),那么现实将使人头疼。

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

1]通过LINQ contactPicker.PickContactsAsync()(或我想象的.ToList())调用,可以将从.ToArray()返回的值强制为真实的C#对象。您必须为每个Contact对象上的每个collection属性执行此操作,但是在它的结尾,您将拥有一个可序列化的C#对象。

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

© www.soinside.com 2019 - 2024. All rights reserved.