private int __Index(lua_State L)
{
switch(InvokeLua.lua_type(L,1))
{
case InvokeLua.LUA_TSTRING:
string memberName = InvokeLua.lua_tostring(L, 1);
MemberInfo[] members = proxy_type.GetMember(memberName);
List<MethodInfo> methods = new List<MethodInfo>();
foreach (MemberInfo member in members)
{
switch (member.MemberType)
{
case MemberTypes.Field:
return PushField(L, (FieldInfo)member);
case MemberTypes.Property:
return PushProperty(L, (PropertyInfo)member);
case MemberTypes.Method:
LuaDotNetMethodProxy methodProxy;
if (proxiedMethods.TryGetValue(memberName, out methodProxy))
{
methodProxy.Push(L);
return 1;
}
MethodInfo method = (MethodInfo)member;
if (method.IsSpecialName || !method.IsPublic)
{
continue;
}
methods.Add(method);
return 0;
}
}
if (methods.Count != 0)
{
GetMethodProxy(L, memberName, methods.ToArray());
return 1;
}
return 0;
case InvokeLua.LUA_TNUMBER:
if (proxy_type.IsArray)
{
int idx = (int)InvokeLua.lua_tonumber(L,1);
if (idx < 0 || idx >= ((Array)proxy_for).Length) {
return 0;
}
PushValue(L, ((Array)proxy_for).GetValue(idx), proxied, proxiedByUserdata);
return 1;
}
else
{
proxy_type.GetProperty("Values");
}
return 0;
default:
return 0;
}
}