public static int getClassMethod(IntPtr luaState) { ObjectTranslator objectTranslator = ObjectTranslator.FromState(luaState); object rawNetObject = objectTranslator.getRawNetObject(luaState, 1); if (rawNetObject == null || !(rawNetObject is IReflect)) { objectTranslator.throwError(luaState, "trying to index an invalid type reference"); LuaDLL.lua_pushnil(luaState); return(1); } IReflect reflect = (IReflect)rawNetObject; if (LuaDLL.lua_isnumber(luaState, 2)) { int num = (int)LuaDLL.lua_tonumber(luaState, 2); objectTranslator.push(luaState, Array.CreateInstance(reflect.get_UnderlyingSystemType(), num)); return(1); } string text = LuaDLL.lua_tostring(luaState, 2); if (text == null) { LuaDLL.lua_pushnil(luaState); return(1); } return(objectTranslator.metaFunctions.getMember(luaState, reflect, null, text, 73)); }
public static int getConstructorSignature(IntPtr luaState) { ObjectTranslator objectTranslator = ObjectTranslator.FromState(luaState); IReflect reflect = null; int num = LuaDLL.luanet_checkudata(luaState, 1, "luaNet_class"); if (num != -1) { reflect = (IReflect)objectTranslator.objects.get_Item(num); } if (reflect == null) { objectTranslator.throwError(luaState, "get_constructor_bysig: first arg is invalid type reference"); } Type[] array = new Type[LuaDLL.lua_gettop(luaState) - 1]; for (int i = 0; i < array.Length; i++) { array[i] = objectTranslator.FindType(LuaDLL.lua_tostring(luaState, i + 2)); } try { ConstructorInfo constructor = reflect.get_UnderlyingSystemType().GetConstructor(array); objectTranslator.pushFunction(luaState, new LuaCSFunction(new LuaMethodWrapper(objectTranslator, null, reflect, constructor).call)); } catch (Exception ex) { objectTranslator.throwError(luaState, ex.get_Message()); LuaDLL.lua_pushnil(luaState); } return(1); }
public LuaMethodWrapper(ObjectTranslator translator, IReflect targetType, string methodName, BindingFlags bindingType) { this._Translator = translator; this._MethodName = methodName; this._TargetType = targetType; if (targetType != null) { this._ExtractTarget = translator.typeChecker.getExtractor(targetType); } this._BindingType = bindingType; this._Members = targetType.get_UnderlyingSystemType().GetMember(methodName, 8, bindingType | 16 | 1); }
public static int callConstructor(IntPtr luaState) { ObjectTranslator objectTranslator = ObjectTranslator.FromState(luaState); MethodCache methodCache = default(MethodCache); object rawNetObject = objectTranslator.getRawNetObject(luaState, 1); if (rawNetObject == null || !(rawNetObject is IReflect)) { LuaDLL.luaL_error(luaState, "trying to call constructor on an invalid type reference"); LuaDLL.lua_pushnil(luaState); return(1); } IReflect reflect = (IReflect)rawNetObject; LuaDLL.lua_remove(luaState, 1); ConstructorInfo[] constructors = reflect.get_UnderlyingSystemType().GetConstructors(); ConstructorInfo[] array = constructors; for (int i = 0; i < array.Length; i++) { ConstructorInfo constructorInfo = array[i]; bool flag = objectTranslator.metaFunctions.matchParameters(luaState, constructorInfo, ref methodCache); if (flag) { try { objectTranslator.push(luaState, constructorInfo.Invoke(methodCache.args)); } catch (TargetInvocationException e) { objectTranslator.metaFunctions.ThrowError(luaState, e); LuaDLL.lua_pushnil(luaState); } catch { LuaDLL.lua_pushnil(luaState); } return(1); } } string text = (constructors.Length != 0) ? constructors[0].get_Name() : "unknown"; LuaDLL.luaL_error(luaState, string.Format("{0} does not contain constructor({1}) argument match", reflect.get_UnderlyingSystemType(), text)); LuaDLL.lua_pushnil(luaState); return(1); }
internal ExtractValue getExtractor(IReflect paramType) { return(this.getExtractor(paramType.get_UnderlyingSystemType())); }