public override MemberInfo[] GetMembers(BindingFlags bindingAttr)
{
MemberInfoList mems = new MemberInfoList();
SimpleHashtable uniqueMems = new SimpleHashtable(32);
if (!this.noExpando && this.field_table != null) //Add any expando properties
{
IEnumerator enu = this.field_table.GetEnumerator();
while (enu.MoveNext())
{
FieldInfo field = (FieldInfo)enu.Current;
mems.Add(field);
uniqueMems[field.Name] = field;
}
}
//Add the public members of the built-in objects if they don't already exist
if (this.isASubClass)
{
MemberInfo[] ilMembers = this.GetType().GetMembers(bindingAttr & ~BindingFlags.NonPublic); //Never expose non public members of old style objects
for (int i = 0, n = ilMembers.Length; i < n; i++)
{
MemberInfo ilMem = ilMembers[i];
//Hide any infrastructure stuff in JSObject
if (!ilMem.DeclaringType.IsAssignableFrom(Typeob.JSObject) && uniqueMems[ilMem.Name] == null)
{
MethodInfo method = ilMem as MethodInfo;
if (method == null || !method.IsSpecialName)
{
mems.Add(ilMem);
uniqueMems[ilMem.Name] = ilMem;
}
}
}
}
//Add parent members if they don't already exist
if (this.parent != null)
{
SimpleHashtable cache = this.parent.wrappedMemberCache;
if (cache == null)
{
cache = this.parent.wrappedMemberCache = new SimpleHashtable(8);
}
MemberInfo[] parentMems = ScriptObject.WrapMembers(((IReflect)this.parent).GetMembers(bindingAttr & ~BindingFlags.NonPublic), this.parent, cache);
for (int i = 0, n = parentMems.Length; i < n; i++)
{
MemberInfo parentMem = parentMems[i];
if (uniqueMems[parentMem.Name] == null)
{
mems.Add(parentMem);
//uniqueMems[parentMem.Name] = parentMem; //No need to add to lookup table - no one else will be looking.
}
}
}
return(mems.ToArray());
}