<PackageReference Include="Castle.Core" Version="3.2.0" />

VirtualObject<TNode>

public abstract class VirtualObject<TNode> : IVirtual<TNode>, IVirtual
using System; using System.Collections.Generic; using System.Threading; namespace Castle.Components.DictionaryAdapter { public abstract class VirtualObject<TNode> : IVirtual<TNode>, IVirtual { private List<IVirtualSite<TNode>> sites; public abstract bool IsReal { get; } public event EventHandler Realized { add { EventHandler eventHandler = this.Realized; EventHandler eventHandler2; do { eventHandler2 = eventHandler; EventHandler value2 = (EventHandler)Delegate.Combine(eventHandler2, value); eventHandler = Interlocked.CompareExchange<EventHandler>(ref this.Realized, value2, eventHandler2); } while ((object)eventHandler != eventHandler2); } remove { EventHandler eventHandler = this.Realized; EventHandler eventHandler2; do { eventHandler2 = eventHandler; EventHandler value2 = (EventHandler)Delegate.Remove(eventHandler2, value); eventHandler = Interlocked.CompareExchange<EventHandler>(ref this.Realized, value2, eventHandler2); } while ((object)eventHandler != eventHandler2); } } protected VirtualObject() { } protected VirtualObject(IVirtualSite<TNode> site) { sites = new List<IVirtualSite<TNode>> { site }; } protected void AddSite(IVirtualSite<TNode> site) { if (sites != null) sites.Add(site); } void IVirtual<TNode>.AddSite(IVirtualSite<TNode> site) { AddSite(site); } protected void RemoveSite(IVirtualSite<TNode> site) { if (sites != null) { int num = sites.IndexOf(site); if (num != -1) sites.RemoveAt(num); } } void IVirtual<TNode>.RemoveSite(IVirtualSite<TNode> site) { RemoveSite(site); } public TNode Realize() { if (TryRealize(out TNode node)) { if (sites != null) { int count = sites.Count; for (int i = 0; i < count; i++) { sites[i].OnRealizing(node); } sites = null; } OnRealized(); } return node; } void IVirtual.Realize() { Realize(); } protected abstract bool TryRealize(out TNode node); protected virtual void OnRealized() { EventHandler realized = this.Realized; if (realized != null) { realized(this, EventArgs.Empty); this.Realized = null; } } } }