环境:
- 单触 (6.2.1.201)
- Mac OSX (10.8.3)
- iOS 模拟器 6.0
我正在尝试编写测试以确保NSNotifications
我想要的NSNotificationCenter.DefaultCenter
. 没问题,我想。我有我的清单,Notifications
我可以问DefaultCenter
它注册了什么......
哦,等等,不,你不能。:\
好的,我可以反映到我的班级并获取我创建的(私人)观察员列表并在那里签到。NSObjects
除了它是一个MonoTouch.Foundation.InternalNSNotificationHandler
对象列表。
好的,让我们做一些检查,InternalNSNotificationHandler
它是一个内部类,它对“notificationCenter”和“notify”MonoTouch.Foundation
有一个非公开的引用。NSNotificationCenter
NSNotification
notify 似乎是一个不错的起点,但我在其中找不到任何对通知名称的引用。好吧,让我们检查一下通知中心。就在那里!在notificationCenter.__mt_ObserverList_var._items[i].Name
. 我尝试反映到__mt_ObserverList_var
(这是 a 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?是因为它没有集会的全部权利吗?在这种环境下甚至有可能获得完全权利吗?