internal virtual void AddProvider <T, TArgs>( [NotNull] ICustomObservable <TArgs> provider, [NotNull] ObservableMap <T, TArgs> map) where TArgs : EventArgs { if (provider == null) { throw new ArgumentNullException(nameof(provider)); } if (map == null) { throw new ArgumentNullException(nameof(map)); } var providerType = provider.GetType(); _notificationsCache.Add <TArgs>(providerType, (sender, args) => { var unboxedArgs = (TArgs)args; if (map.TryGetHandler(unboxedArgs, out var handler)) { handler.Invoke(sender, unboxedArgs); } }); void NotifierDelegate(object sender, TArgs args) => Provider_OnNotify(sender, args, providerType); provider.Notify += NotifierDelegate; _providerUnsubscriberCache.Add <TArgs>(providerType, () => provider.Notify -= NotifierDelegate); }