internal Subscription(ISubscriptionKey <T> subRequestKey, IProvideHandlerDispatchDelegateCaches handlerDispatchDelegateCacheProvider) { OwnerPropId = subRequestKey.OwnerPropId; SubscriptionKind = subRequestKey.SubscriptionKind; SubscriptionPriorityGroup = subRequestKey.SubscriptionPriorityGroup; //SubscriptionTargetKind = sKey.SubscriptionTargetKind; switch (subRequestKey.SubscriptionKind) { case SubscriptionKind.TypedHandler: { Target_Wrk = subRequestKey.Target_Wrk; //new WeakRefKey(subRequestKey.Target); Delegate proxyDelegate = handlerDispatchDelegateCacheProvider.DelegateProxyCache.GetOrAdd(new MethodSubscriptionKind(subRequestKey.Method, subRequestKey.SubscriptionKind)); HandlerProxy = proxyDelegate; Type targetType = subRequestKey.Target.GetType(); TypePair tp = new TypePair(targetType, typeof(T)); CallPcTypedEventSubscriberDelegate callTheListenerDel = handlerDispatchDelegateCacheProvider.CallPcTypedEventSubsCache.GetOrAdd(tp); PcTypedHandlerDispatcher = callTheListenerDel; MethodName = HandlerProxy.Method.Name; break; } //case SubscriptionKind.GenHandler: // break; //case SubscriptionKind.ObjHandler: // break; //case SubscriptionKind.StandardHandler: // break; //case SubscriptionKind.TypedAction: // { // throw new NotImplementedException("Comming soon."); // } //case SubscriptionKind.ObjectAction: // break; //case SubscriptionKind.ActionNoParams: // break; //case SubscriptionKind.LocalBinding: // break; default: throw new InvalidOperationException($"The SubscriptionKind: {SubscriptionKind} is not recognized or is not supported."); } }
public SubscriptionGen(ISubscriptionKeyGen subRequestKey, IProvideHandlerDispatchDelegateCaches handlerDispatchDelegateCacheProvider) { if (subRequestKey.HasBeenUsed) { throw new InvalidOperationException("The Key has already been used."); } OwnerPropId = subRequestKey.OwnerPropId; PropertyType = subRequestKey.PropertyType; SubscriptionKind = subRequestKey.SubscriptionKind; SubscriptionPriorityGroup = subRequestKey.SubscriptionPriorityGroup; //SubscriptionTargetKind = sKey.SubscriptionTargetKind; switch (SubscriptionKind) { case SubscriptionKind.TypedHandler: { Target_Wrk = subRequestKey.Target_Wrk; // new WeakRefKey(subRequestKey.Target); Delegate proxyDelegate = handlerDispatchDelegateCacheProvider.DelegateProxyCache.GetOrAdd(new MethodSubscriptionKind(subRequestKey.Method, subRequestKey.SubscriptionKind)); HandlerProxy = proxyDelegate; Type targetType = subRequestKey.Target.GetType(); TypePair tp = new TypePair(targetType, PropertyType); CallPcTypedEventSubscriberDelegate callTheListenerDel = handlerDispatchDelegateCacheProvider.CallPcTypedEventSubsCache.GetOrAdd(tp); PcTypedHandlerDispatcher = callTheListenerDel; MethodName = HandlerProxy.Method.Name; break; } case SubscriptionKind.GenHandler: { Target_Wrk = subRequestKey.Target_Wrk; // new WeakRefKey(subRequestKey.Target); Delegate proxyDelegate = handlerDispatchDelegateCacheProvider.DelegateProxyCache.GetOrAdd(new MethodSubscriptionKind(subRequestKey.Method, subRequestKey.SubscriptionKind)); HandlerProxy = proxyDelegate; //Type targetType = sKey.GenHandler.Target.GetType(); Type targetType = subRequestKey.Target.GetType(); PcGenHandlerDispatcher = handlerDispatchDelegateCacheProvider.CallPcGenEventSubsCache.GetOrAdd(targetType); MethodName = HandlerProxy.Method.Name; break; } case SubscriptionKind.ObjHandler: { Target_Wrk = subRequestKey.Target_Wrk; // new WeakRefKey(subRequestKey.Target); Delegate proxyDelegate = handlerDispatchDelegateCacheProvider.DelegateProxyCache.GetOrAdd(new MethodSubscriptionKind(subRequestKey.Method, subRequestKey.SubscriptionKind)); HandlerProxy = proxyDelegate; //Type targetType = sKey.ObjHandler.Target.GetType(); Type targetType = subRequestKey.Target.GetType(); PcObjHandlerDispatcher = handlerDispatchDelegateCacheProvider.CallPcObjEventSubsCache.GetOrAdd(targetType); MethodName = HandlerProxy.Method.Name; break; } case SubscriptionKind.StandardHandler: { Target_Wrk = subRequestKey.Target_Wrk; // new WeakRefKey(subRequestKey.Target); Delegate proxyDelegate = handlerDispatchDelegateCacheProvider.DelegateProxyCache.GetOrAdd(new MethodSubscriptionKind(subRequestKey.Method, subRequestKey.SubscriptionKind)); HandlerProxy = proxyDelegate; //Type targetType = sKey.StandardHandler.Target.GetType(); Type targetType = subRequestKey.Target.GetType(); PcStandardHandlerDispatcher = handlerDispatchDelegateCacheProvider.CallPcStEventSubsCache.GetOrAdd(targetType); MethodName = HandlerProxy.Method.Name; break; } case SubscriptionKind.ChangingHandler: { Target_Wrk = subRequestKey.Target_Wrk; // new WeakRefKey(subRequestKey.Target); Delegate proxyDelegate = handlerDispatchDelegateCacheProvider.DelegateProxyCache.GetOrAdd(new MethodSubscriptionKind(subRequestKey.Method, subRequestKey.SubscriptionKind)); HandlerProxy = proxyDelegate; //Type targetType = sKey.ChangingHandler.Target.GetType(); Type targetType = subRequestKey.Target.GetType(); PChangingHandlerDispatcher = handlerDispatchDelegateCacheProvider.CallPChangingEventSubsCache.GetOrAdd(targetType); MethodName = HandlerProxy.Method.Name; break; } //case SubscriptionKind.TypedAction: // break; //case SubscriptionKind.ObjectAction: // break; //case SubscriptionKind.ActionNoParams: // break; //case SubscriptionKind.LocalBinding: // break; default: throw new InvalidOperationException($"The SubscriptionKind: {SubscriptionKind} is not recognized or is not supported."); } //GenDoWhenChanged = sKey.GenDoWhenChanged; //Action = sKey.Action; }