WrapMembers() protected static method

protected static WrapMembers ( MemberInfo members, Object obj ) : System.Reflection.MemberInfo[]
members System.Reflection.MemberInfo
obj Object
return System.Reflection.MemberInfo[]
        private MemberInfo[] GetLocalMember(String name, BindingFlags bindingAttr, bool wrapMembers)
        {
            MemberInfo[] result = null;
            FieldInfo    field  = this.name_table == null ? null : (FieldInfo)this.name_table[name];

            if (field == null && this.isASubClass)
            {
                if (this.memberCache != null)
                {
                    result = (MemberInfo[])this.memberCache[name];
                    if (result != null)
                    {
                        return(result);
                    }
                }
                bindingAttr &= ~BindingFlags.NonPublic; //Never expose non public fields of old style objects
                result       = this.subClassIR.GetMember(name, bindingAttr);
                if (result.Length == 0)
                {
                    result = this.subClassIR.GetMember(name, (bindingAttr & ~BindingFlags.Instance) | BindingFlags.Static);
                }
                int n = result.Length;
                if (n > 0)
                {
                    //Suppress any members that are declared in JSObject or earlier. But keep the ones in Object.
                    int hiddenMembers = 0;
                    foreach (MemberInfo mem in result)
                    {
                        if (JSObject.IsHiddenMember(mem))
                        {
                            hiddenMembers++;
                        }
                    }
                    if (hiddenMembers > 0 && !(n == 1 && this is ObjectPrototype && name == "ToString"))
                    {
                        MemberInfo[] newResult = new MemberInfo[n - hiddenMembers];
                        int          j         = 0;
                        foreach (MemberInfo mem in result)
                        {
                            if (!JSObject.IsHiddenMember(mem))
                            {
                                newResult[j++] = mem;
                            }
                        }
                        result = newResult;
                    }
                }
                if ((result == null || result.Length == 0) && (bindingAttr & BindingFlags.Public) != 0 && (bindingAttr & BindingFlags.Instance) != 0)
                {
                    BindingFlags flags = (bindingAttr & BindingFlags.IgnoreCase) | BindingFlags.Public | BindingFlags.Instance;
                    if (this is StringObject)
                    {
                        result = TypeReflector.GetTypeReflectorFor(Typeob.String).GetMember(name, flags);
                    }
                    else if (this is NumberObject)
                    {
                        result = TypeReflector.GetTypeReflectorFor(((NumberObject)this).baseType).GetMember(name, flags);
                    }
                    else if (this is BooleanObject)
                    {
                        result = TypeReflector.GetTypeReflectorFor(Typeob.Boolean).GetMember(name, flags);
                    }
                    else if (this is StringConstructor)
                    {
                        result = TypeReflector.GetTypeReflectorFor(Typeob.String).GetMember(name, (flags | BindingFlags.Static) & ~BindingFlags.Instance);
                    }
                    else if (this is BooleanConstructor)
                    {
                        result = TypeReflector.GetTypeReflectorFor(Typeob.Boolean).GetMember(name, (flags | BindingFlags.Static) & ~BindingFlags.Instance);
                    }
                    else if (this is ArrayWrapper)
                    {
                        result = TypeReflector.GetTypeReflectorFor(Typeob.Array).GetMember(name, flags);
                    }
                }
                if (result != null && result.Length > 0)
                {
                    if (wrapMembers)
                    {
                        result = ScriptObject.WrapMembers(result, this);
                    }
                    if (this.memberCache == null)
                    {
                        this.memberCache = new SimpleHashtable(32);
                    }
                    this.memberCache[name] = result;
                    return(result);
                }
            }
            if ((bindingAttr & BindingFlags.IgnoreCase) != 0 && (result == null || result.Length == 0))
            {
                result = null;
                IDictionaryEnumerator e = this.name_table.GetEnumerator();
                while (e.MoveNext())
                {
                    if (String.Compare(e.Key.ToString(), name, StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        field = (FieldInfo)e.Value;
                        break;
                    }
                }
            }
            if (field != null)
            {
                return new MemberInfo[] { field }
            }
            ;
            if (result == null)
            {
                result = new MemberInfo[0];
            }
            return(result);
        }
示例#2
0
 private MemberInfo[] GetMember(string name, BindingFlags bindingAttr, bool calledFromParent)
 {
     if (!this.recursive)
     {
         MemberInfo[] members = null;
         if (!this.isComponentScope)
         {
             MemberInfo[] member = base.GetMember(name, bindingAttr | BindingFlags.DeclaredOnly);
             if (member.Length > 0)
             {
                 return(member);
             }
             if (this.componentScopes != null)
             {
                 int num   = 0;
                 int count = this.componentScopes.Count;
                 while (num < count)
                 {
                     members = ((GlobalScope)this.componentScopes[num]).GetMember(name, bindingAttr | BindingFlags.DeclaredOnly, true);
                     if (members.Length > 0)
                     {
                         return(members);
                     }
                     num++;
                 }
             }
             if (this.globalObject != null)
             {
                 members = this.globalObjectTR.GetMember(name, (bindingAttr & ~BindingFlags.NonPublic) | BindingFlags.Static);
             }
             if ((members != null) && (members.Length > 0))
             {
                 return(ScriptObject.WrapMembers(members, this.globalObject));
             }
         }
         else
         {
             members = this.typeReflector.GetMember(name, (bindingAttr & ~BindingFlags.NonPublic) | BindingFlags.Static);
             int length = members.Length;
             if (length > 0)
             {
                 int          num4       = 0;
                 MemberInfo[] infoArray3 = new MemberInfo[length];
                 for (int i = 0; i < length; i++)
                 {
                     MemberInfo info = infoArray3[i] = members[i];
                     if (info.DeclaringType.IsAssignableFrom(Typeob.GlobalScope))
                     {
                         infoArray3[i] = null;
                         num4++;
                     }
                     else if (info is FieldInfo)
                     {
                         FieldInfo info2 = (FieldInfo)info;
                         if (info2.IsStatic && (info2.FieldType == Typeob.Type))
                         {
                             Type type = (Type)info2.GetValue(null);
                             if (type != null)
                             {
                                 infoArray3[i] = type;
                             }
                         }
                     }
                 }
                 if (num4 == 0)
                 {
                     return(members);
                 }
                 if (num4 == length)
                 {
                     return(new MemberInfo[0]);
                 }
                 MemberInfo[] infoArray4 = new MemberInfo[length - num4];
                 int          num6       = 0;
                 foreach (MemberInfo info3 in infoArray3)
                 {
                     if (info3 != null)
                     {
                         infoArray4[num6++] = info3;
                     }
                 }
                 return(infoArray4);
             }
         }
         if (((base.parent != null) && !calledFromParent) && (((bindingAttr & BindingFlags.DeclaredOnly) == BindingFlags.Default) || this.isComponentScope))
         {
             this.recursive = true;
             try
             {
                 members = base.parent.GetMember(name, bindingAttr);
             }
             finally
             {
                 this.recursive = false;
             }
             if ((members != null) && (members.Length > 0))
             {
                 return(members);
             }
         }
     }
     return(new MemberInfo[0]);
 }
        private MemberInfo[] GetLocalMember(string name, BindingFlags bindingAttr, bool wrapMembers)
        {
            MemberInfo[] members = null;
            FieldInfo    info    = (this.name_table == null) ? null : ((FieldInfo)this.name_table[name]);

            if ((info == null) && this.isASubClass)
            {
                if (this.memberCache != null)
                {
                    members = (MemberInfo[])this.memberCache[name];
                    if (members != null)
                    {
                        return(members);
                    }
                }
                bindingAttr &= ~BindingFlags.NonPublic;
                members      = this.subClassIR.GetMember(name, bindingAttr);
                if (members.Length == 0)
                {
                    members = this.subClassIR.GetMember(name, (bindingAttr & ~BindingFlags.Instance) | BindingFlags.Static);
                }
                int length = members.Length;
                if (length > 0)
                {
                    int num2 = 0;
                    foreach (MemberInfo info2 in members)
                    {
                        if (IsHiddenMember(info2))
                        {
                            num2++;
                        }
                    }
                    if ((num2 > 0) && (((length != 1) || !(this is ObjectPrototype)) || (name != "ToString")))
                    {
                        MemberInfo[] infoArray2 = new MemberInfo[length - num2];
                        int          num3       = 0;
                        foreach (MemberInfo info3 in members)
                        {
                            if (!IsHiddenMember(info3))
                            {
                                infoArray2[num3++] = info3;
                            }
                        }
                        members = infoArray2;
                    }
                }
                if (((members == null) || (members.Length == 0)) && (((bindingAttr & BindingFlags.Public) != BindingFlags.Default) && ((bindingAttr & BindingFlags.Instance) != BindingFlags.Default)))
                {
                    BindingFlags flags = ((bindingAttr & BindingFlags.IgnoreCase) | BindingFlags.Public) | BindingFlags.Instance;
                    if (this is StringObject)
                    {
                        members = TypeReflector.GetTypeReflectorFor(Typeob.String).GetMember(name, flags);
                    }
                    else if (this is NumberObject)
                    {
                        members = TypeReflector.GetTypeReflectorFor(((NumberObject)this).baseType).GetMember(name, flags);
                    }
                    else if (this is BooleanObject)
                    {
                        members = TypeReflector.GetTypeReflectorFor(Typeob.Boolean).GetMember(name, flags);
                    }
                    else if (this is StringConstructor)
                    {
                        members = TypeReflector.GetTypeReflectorFor(Typeob.String).GetMember(name, (flags | BindingFlags.Static) & ~BindingFlags.Instance);
                    }
                    else if (this is BooleanConstructor)
                    {
                        members = TypeReflector.GetTypeReflectorFor(Typeob.Boolean).GetMember(name, (flags | BindingFlags.Static) & ~BindingFlags.Instance);
                    }
                    else if (this is ArrayWrapper)
                    {
                        members = TypeReflector.GetTypeReflectorFor(Typeob.Array).GetMember(name, flags);
                    }
                }
                if ((members != null) && (members.Length > 0))
                {
                    if (wrapMembers)
                    {
                        members = ScriptObject.WrapMembers(members, this);
                    }
                    if (this.memberCache == null)
                    {
                        this.memberCache = new SimpleHashtable(0x20);
                    }
                    this.memberCache[name] = members;
                    return(members);
                }
            }
            if (((bindingAttr & BindingFlags.IgnoreCase) != BindingFlags.Default) && ((members == null) || (members.Length == 0)))
            {
                members = null;
                IDictionaryEnumerator enumerator = this.name_table.GetEnumerator();
                while (enumerator.MoveNext())
                {
                    if (string.Compare(enumerator.Key.ToString(), name, StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        info = (FieldInfo)enumerator.Value;
                        break;
                    }
                }
            }
            if (info != null)
            {
                return(new MemberInfo[] { info });
            }
            if (members == null)
            {
                members = new MemberInfo[0];
            }
            return(members);
        }
示例#4
0
        internal MemberInfo[] GetMember(string name, BindingFlags bindingAttr, bool forceInstanceLookup)
        {
            IReflect     reflect;
            Type         type  = null;
            BindingFlags flags = bindingAttr;

            if ((forceInstanceLookup && this.isSuperType) && ((bindingAttr & BindingFlags.FlattenHierarchy) == BindingFlags.Default))
            {
                flags |= BindingFlags.Instance;
            }
            object obj2 = this.contained_object;

Label_0020:
            if (obj2 is IReflect)
            {
                reflect = (IReflect)obj2;
                if ((obj2 is Type) && !this.isSuperType)
                {
                    flags &= ~BindingFlags.Instance;
                }
            }
            else
            {
                reflect = type = Globals.TypeRefs.ToReferenceContext(obj2.GetType());
            }
            MemberInfo[] member = reflect.GetMember(name, flags & ~BindingFlags.DeclaredOnly);
            if (member.Length > 0)
            {
                return(ScriptObject.WrapMembers(member, obj2));
            }
            if ((obj2 is Type) && !this.isSuperType)
            {
                member = Typeob.Type.GetMember(name, BindingFlags.Public | BindingFlags.Instance);
            }
            if (member.Length > 0)
            {
                return(ScriptObject.WrapMembers(member, obj2));
            }
            if ((type != null) && type.IsNestedPublic)
            {
                try
                {
                    new ReflectionPermission(ReflectionPermissionFlag.MemberAccess | ReflectionPermissionFlag.TypeInformation).Assert();
                    FieldInfo field = type.GetField("outer class instance", BindingFlags.NonPublic | BindingFlags.Instance);
                    if (field != null)
                    {
                        obj2 = field.GetValue(obj2);
                        goto Label_0020;
                    }
                }
                finally
                {
                    CodeAccessPermission.RevertAssert();
                }
            }
            if (member.Length > 0)
            {
                return(ScriptObject.WrapMembers(member, obj2));
            }
            return(new MemberInfo[0]);
        }
 private MemberInfo[] GetMember(String name, BindingFlags bindingAttr, bool calledFromParent)
 {
     if (this.recursive)
     {
         return(new MemberInfo[0]);
     }
     MemberInfo[] result = null;
     if (!this.isComponentScope)
     {
         //Look for an expando
         MemberInfo[] members = base.GetMember(name, bindingAttr | BindingFlags.DeclaredOnly);
         if (members.Length > 0)
         {
             return(members);
         }
         if (this.componentScopes != null)
         {
             for (int i = 0, n = this.componentScopes.Count; i < n; i++)
             {
                 GlobalScope sc = (GlobalScope)this.componentScopes[i];
                 result = sc.GetMember(name, bindingAttr | BindingFlags.DeclaredOnly, true);
                 if (result.Length > 0)
                 {
                     return(result);
                 }
             }
         }
         if (this.globalObject != null)
         {
             result = this.globalObjectTR.GetMember(name, bindingAttr & ~BindingFlags.NonPublic | BindingFlags.Static);
         }
         if (result != null && result.Length > 0)
         {
             return(ScriptObject.WrapMembers(result, this.globalObject));
         }
     }
     else
     {
         //Look for global variables represented as static fields on subclass of GlobalScope. I.e. the script block case.
         result = this.typeReflector.GetMember(name, bindingAttr & ~BindingFlags.NonPublic | BindingFlags.Static);
         int n = result.Length;
         if (n > 0)
         {
             int          toBeHidden = 0;
             MemberInfo[] newResult  = new MemberInfo[n];
             for (int i = 0; i < n; i++)
             {
                 MemberInfo mem = newResult[i] = result[i];
                 if (mem.DeclaringType.IsAssignableFrom(Typeob.GlobalScope))
                 {
                     newResult[i] = null; toBeHidden++;
                 }
                 else if (mem is FieldInfo)
                 {
                     FieldInfo field = (FieldInfo)mem;
                     if (field.IsStatic && field.FieldType == Typeob.Type)
                     {
                         Type t = (Type)field.GetValue(null);
                         if (t != null)
                         {
                             newResult[i] = t;
                         }
                     }
                 }
             }
             if (toBeHidden == 0)
             {
                 return(result);
             }
             if (toBeHidden == n)
             {
                 return(new MemberInfo[0]);
             }
             MemberInfo[] remainingMembers = new MemberInfo[n - toBeHidden];
             int          j = 0;
             foreach (MemberInfo mem in newResult)
             {
                 if (mem != null)
                 {
                     remainingMembers[j++] = mem;
                 }
             }
             return(remainingMembers);
         }
     }
     if (this.parent != null && !calledFromParent && ((bindingAttr & BindingFlags.DeclaredOnly) == 0 || this.isComponentScope))
     {
         this.recursive = true;
         try{
             result = ((ScriptObject)this.parent).GetMember(name, bindingAttr);
         }finally{
             this.recursive = false;
         }
         if (result != null && result.Length > 0)
         {
             return(result);
         }
     }
     return(new MemberInfo[0]);
 }