private void StartProcess <TEvent>(TEvent @event) where TEvent : IEvent { var eventType = typeof(TEvent); var starter = _definition.GetStarterPredicate <TEvent>()(@event, GetInstanceData()); if (!starter) { throw new Exception($"Definition {_definition.GetType()} does not accept eventType {eventType} as a starter event."); } var idSelector = _definition.GetCorrelationFilter <TEvent>(); if (idSelector == null) { throw new ArgumentNullException($"No correlation defined for eventType {eventType} in definition {_definition.GetType()}"); } if (State != InstanceStates.NotStarted) { throw new Exception($"Cannot start an instance which is in state {State}"); } var identity = idSelector(@event); Emit(new ProcessStarted(identity)); }