public void Subscribe(object subscriber, Action <IConstraintinfoBuilder> buildConstraints) { base.Subscribe(subscriber); if (eventProxy != null) { List <IConstraintInfo> constraintInfos = new List <IConstraintInfo>(); if (buildConstraints != null) { var builder = new ConstraintinfoBuilder(constraintInfos, subscriptionStore); buildConstraints(builder); } CheckSubscriberConstraints(constraintInfos); subscriptionStore.AddConstraints(subscriber, constraintInfos); var proxyEvents = GetProxyEventTypes(subscriber); var subscriptions = from pe in proxyEvents join ci in constraintInfos on pe equals ci.GetType().GetGenericArguments()[0] into eci from ciOuter in eci.DefaultIfEmpty() select new Subscription(pe, ciOuter != null ? ciOuter.GetConstraint() : null, ciOuter.GetConstraintId()); var actualSubscriptions = subscriptionStore.GetActualSubscriptions(subscriptions.ToList()); eventProxy.Subscribe(actualSubscriptions); } }