Beispiel #1
0
        protected static BaseHandler GetMember(ScriptState luaState, object o, string memberName)
        {
            var runtime = LuaRuntimePool.GetRuntime(luaState);
            var type    = o as Type;

            if (type != null)
            {
                // index(t, k) remove k param
                // call static method、field、protery
                LuaCore.RemoveValue(luaState, 1);
            }
            else
            {
                type = o.GetType();
            }

            var key     = ScriptHelper.GenerateKey(type, memberName);
            var handler = runtime.ClassMgr.Cache[key] as BaseHandler;

            if (handler == null)
            {
                #region Create Handler

                const BindingFlags flags = ReflectionHelper.DefBindingFlags | BindingFlags.Static;
                var members = type.GetMember(memberName, flags);
                if (members.Length > 0)
                {
                    var member = members[0];
                    switch (member.MemberType)
                    {
                    case MemberTypes.Field:
                        handler = new FieldHandler(luaState);
                        handler.Initilaze(new[] { ReflectionHelper.GetField((FieldInfo)member) });
                        break;

                    case MemberTypes.Property:
                        handler = new PropertyHandler(luaState);
                        handler.Initilaze(new[] { ReflectionHelper.GetProperty((PropertyInfo)member) });
                        break;

                    case MemberTypes.Method:
                        handler = new MethodHandler(luaState);
                        handler.Initilaze(new MethodFinder(type, memberName, members));
                        break;
                    }
                }
                if (handler != null)
                {
                    runtime.ClassMgr.Cache.Add(key, handler);
                }

                #endregion
            }
            if (handler != null)
            {
                handler.ChangeInstance(o);
            }
            return(handler);
        }