C# 如何使用Monotouch从IntPtr获取ABPerson

C# 如何使用Monotouch从IntPtr获取ABPerson,c#,iphone,xamarin.ios,intptr,abpersonviewcontroller,C#,Iphone,Xamarin.ios,Intptr,Abpersonviewcontroller,Monotouch中有没有一种方法可以从IntPtr获取ABPerson对象。我正在使用ABPeoplePickerNavigationController及其ABPeoplePickerNavigationControllerDelegate。我必须阅读方法ShouldContinue中所选人员的一些属性。我的代码如下所示: ABPeoplePickerNavigationController nc = new ABPeoplePickerNavigationController(); nc.

Monotouch中有没有一种方法可以从IntPtr获取ABPerson对象。我正在使用ABPeoplePickerNavigationController及其ABPeoplePickerNavigationControllerDelegate。我必须阅读方法ShouldContinue中所选人员的一些属性。我的代码如下所示:

ABPeoplePickerNavigationController nc = new ABPeoplePickerNavigationController();
nc.Delegate = new CustomABPeoplePickerNavigationControllerDelegate();
public class CustomABPeoplePickerNavigationControllerDelegate : ABPeoplePickerNavigationControllerDelegate
{           
   public override bool ShouldContinue (ABPeoplePickerNavigationController peoplePicker, IntPtr selectedPerson)
   {
       // *** HERE I HAVE TO GET ABPerson FROM IntPtr ***
       peoplePicker.DismissModalViewControllerAnimated(false);
       return true;
   }
}   
我的自定义委托如下所示:

ABPeoplePickerNavigationController nc = new ABPeoplePickerNavigationController();
nc.Delegate = new CustomABPeoplePickerNavigationControllerDelegate();
public class CustomABPeoplePickerNavigationControllerDelegate : ABPeoplePickerNavigationControllerDelegate
{           
   public override bool ShouldContinue (ABPeoplePickerNavigationController peoplePicker, IntPtr selectedPerson)
   {
       // *** HERE I HAVE TO GET ABPerson FROM IntPtr ***
       peoplePicker.DismissModalViewControllerAnimated(false);
       return true;
   }
}   

没有尝试过它是否有效,但您可以:

ABPerson person = peoplePicker.AddressBook.SingleOrDefault(s => s.Handle == selectedPerson) as ABPerson;

不幸的是,接受IntPtr的ABPerson构造函数是内部的MonoTouch。您可以:

  • 使用反射调用.ctor
  • 使用另一个API检索ABPerson实例
但是您不能使用继承来解决这个问题,因为base(ABRecord).ctor也是内部的

我会看看为什么这个.ctor是内部的(当然,很多这样的.ctor在MonoTouch中是公开的),如果可能的话(也就是说,如果没有其他选择),在即将发布的版本中修复它


编辑:进一步阅读建议您使用ABPeoplePickerNavigationController上的SelectPerson事件。这将使用一个内部委托,该委托将IntPtr转换为ABPerson实例,从而解决您的问题:)

我以前使用过SelectPerson事件,但由于此问题,我不得不将其更改为ABPeoplePickerNavigationControllerDelegate:。如果我使用SelectPerson事件,那么我的委托将不再被使用(出于某种原因)。不幸的是,这不是我的选择。求求你,你能帮我解决这个问题吗?甚至可以使用反射调用内部保护构造函数吗?提前感谢您,请在bugzilla.xamarin.com上填写一份bug报告,我们将尝试找出测试解决方案以使其正常工作。短期解决方案仍然是使用反射。在选择特定人员时,在ABPeoplePickerNavigationController上使用SelectPerson事件似乎会崩溃。尤其是这个苹果联系人,它不知道SingleOrDefault方法:(但我试图遍历所有人,并将他们的“句柄”与我的selectPerson IntPtr进行比较,但他们不匹配。他们可能是不同的指针。SingleOrDefault是System.Linq命名空间的扩展方法。你可以将其添加到文件中。我将对此进行进一步检查。这会在没有调试信息的情况下崩溃:(实际上,这与使用
peoplePicker.SelectPerson+=delegate(对象选取器\u发送方,ABPeoplePickerSelectPersonEventArgs选取器\u e){}