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); }