Example #1
0
        private QueryResult <M> Query <M>(string?optionalName, BindingFlags bindingAttr, Func <M, bool>?optionalPredicate) where M : MemberInfo
        {
            MemberPolicies <M> policies = MemberPolicies <M> .Default;

            bindingAttr = policies.ModifyBindingFlags(bindingAttr);
            bool immediateTypeOnly = NeedToSearchImmediateTypeOnly(bindingAttr);
            bool ignoreCase        = (bindingAttr & BindingFlags.IgnoreCase) != 0;

            TypeComponentsCache   cache = Cache;
            QueriedMemberList <M> queriedMembers;

            if (optionalName == null)
            {
                queriedMembers = cache.GetQueriedMembers <M>(immediateTypeOnly);
            }
            else
            {
                queriedMembers = cache.GetQueriedMembers <M>(optionalName, ignoreCase: ignoreCase, immediateTypeOnly: immediateTypeOnly);
            }

            if (optionalPredicate != null)
            {
                queriedMembers = queriedMembers.Filter(optionalPredicate);
            }
            return(new QueryResult <M>(bindingAttr, queriedMembers));
        }
Example #2
0
        //
        // If member is a virtual member that implicitly overrides a member in a base class, return the overridden member.
        // Otherwise, return null.
        //
        // - MethodImpls ignored. (I didn't say it made sense, this is just how the desktop api we're porting behaves.)
        // - Implemented interfaces ignores. (I didn't say it made sense, this is just how the desktop api we're porting behaves.)
        //
        public static M GetImplicitlyOverriddenBaseClassMember <M>(this M member) where M : MemberInfo
        {
            MemberPolicies <M> policies = MemberPolicies <M> .Default;
            MethodAttributes   visibility;
            bool isStatic;
            bool isVirtual;
            bool isNewSlot;

            policies.GetMemberAttributes(member, out visibility, out isStatic, out isVirtual, out isNewSlot);
            if (isNewSlot || !isVirtual)
            {
                return(null);
            }
            String   name     = member.Name;
            TypeInfo typeInfo = member.DeclaringType.GetTypeInfo();

            for (; ;)
            {
                Type baseType = typeInfo.BaseType;
                if (baseType == null)
                {
                    return(null);
                }
                typeInfo = baseType.GetTypeInfo();
                foreach (M candidate in policies.GetDeclaredMembers(typeInfo))
                {
                    if (candidate.Name != name)
                    {
                        continue;
                    }
                    MethodAttributes candidateVisibility;
                    bool             isCandidateStatic;
                    bool             isCandidateVirtual;
                    bool             isCandidateNewSlot;
                    policies.GetMemberAttributes(member, out candidateVisibility, out isCandidateStatic, out isCandidateVirtual, out isCandidateNewSlot);
                    if (!isCandidateVirtual)
                    {
                        continue;
                    }
                    if (!policies.AreNamesAndSignatureEqual(member, candidate))
                    {
                        continue;
                    }
                    return(candidate);
                }
            }
        }