イベント レシーバーの外部から更新を実行するときに、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 が true の場合は、rh で DisableEventFiring() を呼び出し、終了したら rh で EnableEventFiring() を呼び出します。見えないリンクは「rh」と「item」の間です。SharePoint は、更新を行うときに rh をイベント レシーバーとして使用することをどのように "認識" しますか?
私はそれを明確に説明したことを願っています。そうでない場合はお知らせください。さらに明確にします。