public TransitionOnStateDelegate FindAssociatedOnStateMethod(string methodName) { MethodInfo info = null; try { if (m_OnStateMethodInfoCache.ContainsKey(methodName)) { return(m_OnStateMethodInfoCache[methodName]); } else { foreach (System.Object obj in m_AssociatedObjects) { info = obj.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); if (info != null) { TransitionOnStateDelegate del = Delegate.CreateDelegate(typeof(TransitionOnStateDelegate), obj, info) as TransitionOnStateDelegate; m_OnStateMethodInfoCache.Add(methodName, del); return(del); } } } return(null); } catch (Exception ex) { Log.Exception(ex); return(null); } }
public void AttachHandler(TransitionOnStateDelegate d) { CanTransition = d; }
public TransitionConditional_OnState(StaticString name, TransitionOnStateDelegate d) : base(name) { AttachHandler(d); }
public TransitionConditionalFactory() { StaticString declType_OnDelay = new StaticString("TransitionConditional_OnDelay"); StaticString declType_OnEvent = new StaticString("TransitionConditional_OnEvent"); StaticString declType_OnState = new StaticString("TransitionConditional_OnState"); m_Type2DeclTypeMap.Add(declType_OnDelay, declType_OnDelay); m_Type2DeclTypeMap.Add(declType_OnEvent, declType_OnEvent); m_Type2DeclTypeMap.Add(declType_OnState, declType_OnState); m_Type2DeclTypeMap.Add(new StaticString("OnDelay"), declType_OnDelay); m_Type2DeclTypeMap.Add(new StaticString("OnEvent"), declType_OnEvent); m_Type2DeclTypeMap.Add(new StaticString("OnState"), declType_OnState); Action <Transition <TOwner>, StaticString, StaticString, List <StaticString> > handler = delegate(Transition <TOwner> transition, StaticString behaviorDeclType, StaticString name, List <StaticString> args) { try { Type eventType = typeof(TransitionEventDelegate); TransitionEventDelegate del = null; // If we want to only have one behavior per delegate we should create and cache it here // And then only register it once transition.AddConditional(AllocateAndAttachEventConditional(behaviorDeclType, name, ref del, eventType)); //Type TOwner = transition.Owner.GetType(); //MethodInfo methodInfo = typeof(TOwner).GetMethod( "RegisterDelegate", BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public ); //methodInfo.Invoke( transition.Owner, new object[] { args[0], del } ); transition.Owner.RegisterEvent(args[0], del); } catch (Exception ex) { Log.Exception(ex); } }; m_ConditionalAllocators.Add(declType_OnEvent, handler); handler = delegate(Transition <TOwner> transition, StaticString behaviorDeclType, StaticString name, List <StaticString> args) { var argInstsSlip = DataStructureLibrary <List <System.Object> > .Instance.CheckOut(); argInstsSlip.Value.Clear(); argInstsSlip.Value.Add(name); try { string behaviorQualifiedName = TransitionConditionalLibrary.Instance.FindAssemblyQualifiedName(behaviorDeclType.ToString(), 1); string argName = args[0].ToString(); object arg = transition.Owner.FindAssociatedOnDelayMethod(argName); if (arg == null) { arg = GetValue(transition.Owner, argName); } argInstsSlip.Value.Add(arg); //if (args.Count == 2) //{ // TransitionPlug<float> plug = new TransitionPlug<float>(); // transition.Owner.RegisterPlug(args[1], plug); // argInstsSlip.Value.Add(plug); //} transition.AddConditional(AllocateNonGenericConditional(behaviorQualifiedName, argInstsSlip.Value)); } catch (Exception ex) { Log.Exception(ex); } finally { argInstsSlip.Dispose(); } }; m_ConditionalAllocators.Add(declType_OnDelay, handler); handler = delegate(Transition <TOwner> transition, StaticString behaviorDeclType, StaticString name, List <StaticString> args) { var argInstsSlip = DataStructureLibrary <List <System.Object> > .Instance.CheckOut(); argInstsSlip.Value.Clear(); argInstsSlip.Value.Add(name); TransitionOnStateDelegate del = transition.Owner.FindAssociatedOnStateMethod(args[0].ToString()); ExceptionUtility.Verify <ArgumentException>(del != null, string.Format("Unable to find method {0} for OnState {1}( {0} );", args[0].ToString(), name.ToString())); argInstsSlip.Value.Add(del); try { string behaviorQualifiedName = TransitionConditionalLibrary.Instance.FindAssemblyQualifiedName(behaviorDeclType.ToString(), 1); transition.AddConditional(AllocateNonGenericConditional(behaviorQualifiedName, argInstsSlip.Value)); } catch (Exception ex) { Log.Exception(ex); } finally { argInstsSlip.Dispose(); } }; m_ConditionalAllocators.Add(declType_OnState, handler); }