public void StateMachineManager_Execute(Triggers.UserWizard Action) { #region Documentacion Reflection. Crear instancias //Documentacion Reflection. Crear instancias //MethodInfo method = typeof(W).GetMethod("TryFireTriggerParam"); //Type typeEnum = typeof(WizardUser.Trigger); //Type typeHash = typeof(System.Collections.Hashtable); //MethodInfo generic = method.MakeGenericMethod(typeEnum, typeHash); //generic.Invoke(sm, new object[] { WizardUser.Trigger.Next, arg }); //Type unboundGenericType = typeof(W); //Type typeEnum = typeof(WizardUser.Trigger); //Type typeHash = typeof(System.Collections.Hashtable); //Type boundGenericType = unboundGenericType.MakeGenericType(typeEnum, typeHash); //object instance = Activator.CreateInstance(boundGenericType); #endregion //Preparo HashMap para invocar el Trigger con Parametros //Transfiero el Modelo al DataTemp["Model"] para actualizar los datos en el Temp y asi mantener los datos del flujo //W smTemp = SM; //Se tiene que hacer por Reflection porque la StateMachine puede ser de cualquier tipo. try { Hashtable arg = StateMachineManager_SetArgument(TransferModeltoDataTemp(StateMachineManager_ViewModel)); //Ejecucion por Reflection //MethodInfo TryFireTriggerParamMethod = StateMachineManager.GetType().GetMethod("TryFireTriggerParam"); //TryFireTriggerParamMethod.Invoke(StateMachineManager, new object[] { Action, arg }); //Action viene por Parametro, y Arg(Argumentos del Trigger) se genera StateMachineManager_SetArgument //Ejecucion por Ninject IWorkflowWizardGeneric _sm = (IWorkflowWizardGeneric)StateMachineManager; _sm.TryFireTriggerParam(Action, arg); } catch (Exception e) { throw (e.InnerException != null) ? e.InnerException : e; } finally { //Como fue invocado por Reflection no invoca al Set del StateMachineManager, por lo tanto se pierde el TempData["SM"] ClearModelErrors(StateMachineManager_ViewModel); StateMachineManager = _sm; } //return sm; }
//public bool TryFireTrigger(Trigger trigger) //{ // if (!stateMachine.CanFire(trigger)) // { // return false; // } // stateMachine.Fire(trigger); // return true; //} public bool TryFireTriggerParam(Triggers.UserWizard trigger, Hashtable arg) { switch (trigger) { case Triggers.UserWizard.Next: { stateMachine.Fire(paramNextTrigger, arg); break; } case Triggers.UserWizard.Previous: { stateMachine.Fire(paramPrevTrigger, arg); break; } case Triggers.UserWizard.New: { stateMachine.Fire(paramNewTrigger, arg); break; } } return(true); }