当从事件接收器外部执行更新时,我遇到了这篇文章,它为防止事件接收器触发 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 为真,我们在 rh 上调用 DisableEventFiring(),然后在完成后在 rh 上调用 EnableEventFiring()。我看不到的链接在“rh”和“item”之间。在进行更新时,SharePoint 如何“知道”将 rh 用作事件接收器?
我希望我已经解释清楚了。如果不让我知道,我会尝试进一步澄清。