Esempio n. 1
0
            //
            // Returns the cached result of a name-specific query on the Type's members, as if you'd passed in
            //
            //  BindingFlags == Public | NonPublic | Instance | Static | FlattenHierarchy
            //
            public QueriedMemberList <M> GetQueriedMembers <M>(string name, bool ignoreCase) where M : MemberInfo
            {
                int    index = MemberPolicies <M> .MemberTypeIndex;
                object obj   = ignoreCase ? _perNameQueryCaches_CaseInsensitive[index] : _perNameQueryCaches_CaseSensitive[index];

                Debug.Assert(obj is PerNameQueryCache <M>);
                PerNameQueryCache <M> unifier = Unsafe.As <PerNameQueryCache <M> >(obj);
                QueriedMemberList <M> result  = unifier.GetOrAdd(name);

                return(result);
            }
            //
            // Returns the cached result of a name-specific query on the Type's members, as if you'd passed in
            //
            //  BindingFlags == Public | NonPublic | Instance | Static | FlattenHierarchy  (immediateTypeOnly == false)
            //                  Public | NonPublic | Instance | Static | DeclaredOnly      (immediateTypeOnly == true)
            //
            public QueriedMemberList <M> GetQueriedMembers <M>(string name, bool ignoreCase, bool immediateTypeOnly) where M : MemberInfo
            {
                int index = MemberPolicies <M> .MemberTypeIndex;

                object[] cacheArray = ignoreCase ?
                                      (immediateTypeOnly ? _perNameQueryCaches_CaseInsensitive_ImmediateTypeOnly : _perNameQueryCaches_CaseInsensitive) :
                                      (immediateTypeOnly ? _perNameQueryCaches_CaseSensitive_ImmediateTypeOnly : _perNameQueryCaches_CaseSensitive);

                object unifierAsObject        = cacheArray[index];
                PerNameQueryCache <M> unifier = (PerNameQueryCache <M>)unifierAsObject;
                QueriedMemberList <M> result  = unifier.GetOrAdd(name);

                return(result);
            }
Esempio n. 3
0
            //
            // Returns the cached result of a name-agnostic query on the Type's members, as if you'd passed in
            //
            //  BindingFlags == Public | NonPublic | Instance | Static | FlattenHierarchy
            //
            public QueriedMemberList <M> GetQueriedMembers <M>() where M : MemberInfo
            {
                int    index  = MemberPolicies <M> .MemberTypeIndex;
                object result = Volatile.Read(ref _nameAgnosticQueryCaches[index]);

                if (result == null)
                {
                    QueriedMemberList <M> newResult = QueriedMemberList <M> .Create(_type, optionalNameFilter : null, ignoreCase : false);

                    newResult.Compact();
                    result = newResult;
                    Volatile.Write(ref _nameAgnosticQueryCaches[index], result);
                }

                Debug.Assert(result is QueriedMemberList <M>);
                return(Unsafe.As <QueriedMemberList <M> >(result));
            }