private static int indexString(IntPtr l, object self, string key)
        {
            Type type = LuaVarObject.getType(self);

            if (self is IDictionary)
            {
                if (!type.IsGenericType || type.GetGenericArguments()[0] == typeof(string))
                {
                    object obj = (self as IDictionary)[key];
                    if (obj != null)
                    {
                        LuaObject.pushValue(l, true);
                        LuaObject.pushVar(l, obj);
                        return(2);
                    }
                }
            }
            IList <MemberInfo> cacheMembers = LuaVarObject.GetCacheMembers(type, key);

            if (cacheMembers == null || cacheMembers.Count == 0)
            {
                return(LuaObject.error(l, "Can't find " + key));
            }
            LuaObject.pushValue(l, true);
            MemberInfo  memberInfo = cacheMembers[0];
            MemberTypes memberType = memberInfo.MemberType;

            switch (memberType)
            {
            case MemberTypes.Event:
                return(2);

            case MemberTypes.Constructor | MemberTypes.Event:
            {
IL_B3:
                if (memberType == MemberTypes.Method)
                {
                    LuaCSFunction o = new LuaCSFunction(new LuaVarObject.MethodWrapper(self, cacheMembers).invoke);
                    LuaObject.pushObject(l, o);
                    return(2);
                }
                if (memberType != MemberTypes.Property)
                {
                    return(1);
                }
                PropertyInfo propertyInfo = (PropertyInfo)memberInfo;
                MethodInfo   getMethod    = propertyInfo.GetGetMethod(true);
                LuaObject.pushVar(l, getMethod.Invoke(self, null));
                return(2);
            }

            case MemberTypes.Field:
            {
                FieldInfo fieldInfo = (FieldInfo)memberInfo;
                LuaObject.pushVar(l, fieldInfo.GetValue(self));
                return(2);
            }
            }
            goto IL_B3;
        }
        private static int newindexString(IntPtr l, object self, string key)
        {
            if (self is IDictionary)
            {
                Type type = LuaVarObject.getType(self);
                Type t    = type.GetGenericArguments()[1];
                (self as IDictionary)[key] = LuaObject.checkVar(l, 3, t);
                return(LuaObject.ok(l));
            }
            Type type2 = LuaVarObject.getType(self);
            IList <MemberInfo> cacheMembers = LuaVarObject.GetCacheMembers(type2, key);

            if (cacheMembers == null || cacheMembers.Count == 0)
            {
                return(LuaObject.error(l, "Can't find " + key));
            }
            MemberInfo  memberInfo = cacheMembers[0];
            MemberTypes memberType = memberInfo.MemberType;

            switch (memberType)
            {
            case MemberTypes.Event:
                return(LuaObject.error(l, "Event can't set"));

            case MemberTypes.Constructor | MemberTypes.Event:
            {
IL_8F:
                if (memberType == MemberTypes.Method)
                {
                    return(LuaObject.error(l, "Method can't set"));
                }
                if (memberType != MemberTypes.Property)
                {
                    goto IL_121;
                }
                PropertyInfo propertyInfo = (PropertyInfo)memberInfo;
                MethodInfo   setMethod    = propertyInfo.GetSetMethod(true);
                object       obj          = LuaObject.checkVar(l, 3, propertyInfo.PropertyType);
                setMethod.Invoke(self, new object[]
                    {
                        obj
                    });
                goto IL_121;
            }

            case MemberTypes.Field:
            {
                FieldInfo fieldInfo = (FieldInfo)memberInfo;
                object    value     = LuaObject.checkVar(l, 3, fieldInfo.FieldType);
                fieldInfo.SetValue(self, value);
                goto IL_121;
            }
            }
            goto IL_8F;
IL_121:
            return(LuaObject.ok(l));
        }