如何在MonoTouch中反映内部和私有嵌套类?

时间:2013-04-12 19:20:19

标签: c# reflection xamarin.ios

环境:

  • MonoTouch(6.2.1.201)
  • Mac OSX(10.8.3)
  • iOS模拟器6.0

我正在尝试编写测试,以确保我想要的NSNotifications注册NSNotificationCenter.DefaultCenter没问题,我想。我有Notifications的列表,我可以问DefaultCenter注册的是什么......

哦,等等,不,你不能。 :\

好吧,好吧,我可以反思我的课程并获得我创建的(私人)观察员列表并在那里签到。除了它是NSObjects,以及MonoTouch.Foundation.InternalNSNotificationHandler个对象的列表。

好的,让我们进行一些检查,InternalNSNotificationHandlerMonoTouch.Foundation中的内部课程,它有NSNotificationCenter“notificationCenter”和NSNotification的非公开引用“通知”。

通知似乎是一个好的开始,但我找不到任何对通知名称的引用。好吧,让我们检查一下notificationCenter。它就是!在notificationCenter.__mt_ObserverList_var._items[i].Name。我尝试反映到__mt_ObserverList_var(这是一个List<ObservedData>),所以我可以循环浏览它们并将.Names与我的列表进行比较,并确保它们都在那里。

var ifcType = typeof(myClass);
var observerField = ifcType.GetField("_observers", BindingFlags.NonPublic | BindingFlags.Static);
var observers = observerField.GetValue(null);
var internalNSNotHandlerType = observers[0].GetType();
// so far so good
var notCenterField = internalNSNotHandlerType.GetField("notificationCenter", BindingFlags.NonPublic); // this returns null

无论我做什么,它都会返回null。我尝试从程序集中加载类型:

var assembly = Assembly.GetAssembly(typeof(NSNotificationCenter));
var internalNSNotHandlerType = assembly.GetType("MonoTouch.Foundation.InternalNSNotificationHandler");
// so far so good
var notCenterField = internalNSNotHandlerType.GetField("notificationCenter", BindingFlags.NonPublic); // this returns null

如果我无法做到这一点,我就无法进入List<ObservedData>

为什么这总是返回null?是因为它没有装配的完整权利吗?甚至可以在这种环境中获得完全权利吗?

0 个答案:

没有答案