Ejemplo n.º 1
0
        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);
 }
Ejemplo n.º 4
0
        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);
        }