Я наткнулся на этот post с отличным решением проблемы предотвращения срабатывания приемника событий SPListItem при выполнении обновления извне приемника событий. Код работает на 100%, как описано, и я впечатлен решением, проблема в том, что я его не совсем понимаю.
Для простоты давайте проигнорируем методы SystemUpdate, поэтому мы имеем дело только с перегрузкой SPListItem.Update и частным классом, объявленным в коде.
Бит, который я не «понимаю», - это то, как класс rh «связан» или «связан» с элементом SPListItem. Воспроизведение метода сохранения, нажав назад ...
public static void Update(this SPListItem item, bool doNotFireEvents)
{
SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
if (doNotFireEvents)
{
try
{
rh.DisableEventFiring();
item.Update();
}
finally
{
rh.EnableEventFiring();
}
}
else
{
item.Update();
}
}
Я вижу, что мы создаем экземпляр SPItemEventReceiverHandling, rh, и если doNotFireEvents истинно, мы вызываем DisableEventFiring () для rh, а затем, когда закончим, вызываем EnableEventFiring () для rh. Ссылка, которую я не вижу, находится между "rh" и "item". Как SharePoint «знает» использовать rh в качестве приемника событий при обновлении?
Надеюсь, я ясно это объяснил. Если нет, дайте мне знать, и я постараюсь уточнить дальше.