环境:
我正在尝试编写测试,以确保我想要的NSNotifications
注册NSNotificationCenter.DefaultCenter
。 没问题,我想。我有Notifications
的列表,我可以问DefaultCenter
注册的是什么......
好吧,好吧,我可以反思我的课程并获得我创建的(私人)观察员列表并在那里签到。除了它是NSObjects
,以及MonoTouch.Foundation.InternalNSNotificationHandler
个对象的列表。
好的,让我们进行一些检查,InternalNSNotificationHandler
是MonoTouch.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?是因为它没有装配的完整权利吗?甚至可以在这种环境中获得完全权利吗?