您使用 GetContactInformation 方法获取ContactEndpoint 对象的列表。现在您可以浏览列表并找到您想要的phone number type。
例如
var contactEndpoints = (Contact.GetContactInformation(ContactInformationType.ContactEndpoints) as List<object> ?? new List<object>()).Select(_ => _ as ContactEndpoint).Where(_ => _ != null);
foreach (var contactEndpoint in contactEndpoints)
{
switch (contactEndpoint.Type)
{
case ContactEndpointType.WorkPhone:
break;
case ContactEndpointType.MobilePhone:
break;
case ContactEndpointType.HomePhone:
break;
case ContactEndpointType.OtherPhone:
break;
case ContactEndpointType.Lync:
break;
case ContactEndpointType.VoiceMail:
break;
case ContactEndpointType.Invalid:
break;
default:
throw new ArgumentOutOfRangeException();
}
}
现在您将遇到的问题是,对于非缓存联系人的 ContactInformationType.ContactEndpoints 将返回 null(或空列表,我忘记了)。
因此您需要了解获取此信息不会同步发生。如果您确实需要此信息,则需要请求它,它将在联系人对象的事件更新中出现。为此,您需要为所需的详细信息创建联系人订阅,然后为特定联系人订阅订阅。
在应用启动时使用客户端 ContactManager 设置订阅:
_contactSubscription = _client.ContactManager.CreateSubscription();
_contactSubscription.Subscribe(ContactSubscriptionRefreshRate.High,
new[]
{
ContactInformationType.ContactEndpoints
});
}
catch (Exception e)
{
Log.WriteLine(e);
_mediator.ClientComConnectionDead();
}
}
设置联系人并订阅联系人更改:
contact.ContactInformationChanged += ContactOnContactInformationChanged;
_contactSubscription.AddContact(contact);
处理更新的联系信息:
private void ContactOnContactInformationChanged(object sender, ContactInformationChangedEventArgs e)
{
if (e.ChangedContactInformation.Any(_ => _ == ContactInformationType.ContactEndpoints))
{
var contactEndpoints = (Contact.GetContactInformation(ContactInformationType.ContactEndpoints) as List<object> ?? new List<object>()).Select(_ => _ as ContactEndpoint).Where(_ => _ != null);
foreach (var contactEndpoint in contactEndpoints)
{
switch (contactEndpoint.Type)
{
case ContactEndpointType.WorkPhone:
break;
case ContactEndpointType.MobilePhone:
break;
case ContactEndpointType.HomePhone:
break;
case ContactEndpointType.OtherPhone:
break;
case ContactEndpointType.Lync:
break;
case ContactEndpointType.VoiceMail:
break;
case ContactEndpointType.Invalid:
break;
default:
throw new ArgumentOutOfRangeException();
}
}
}
}
当你完成联系后,你需要解开和清理:
contact.ContactInformationChanged -= ContactOnContactInformationChanged;
_contactSubscription.RemoveContact(contact);
完成订阅后,您需要在应用程序清理时取消订阅:
_contactSubscription.Unsubscribe();
联系人更新可以随时进入,也可以多次进入,或者如果没有联系人端点,则可能根本不更新。其后端是 AD 联系信息,因此如果 AD 联系更新,您将收到您订阅的信息的更新。
此界面并不是真正用于询问联系信息并获得答复,它更多的是用于连接用户界面元素,以便在当前显示时实时更新它们。