static IEnumerable <IAttribute> GetAttributes(IEntity entity, Predicate <IType> attributeTypePredicate, bool inherit)
        {
            if (!inherit)
            {
                foreach (var attr in entity.Attributes)
                {
                    if (attributeTypePredicate(attr.AttributeType))
                    {
                        yield return(attr);
                    }
                }
                yield break;
            }
            ITypeDefinition typeDef = entity as ITypeDefinition;

            if (typeDef != null)
            {
                foreach (var baseType in typeDef.GetNonInterfaceBaseTypes().Reverse())
                {
                    ITypeDefinition baseTypeDef = baseType.GetDefinition();
                    if (baseTypeDef == null)
                    {
                        continue;
                    }
                    foreach (var attr in baseTypeDef.Attributes)
                    {
                        if (attributeTypePredicate(attr.AttributeType))
                        {
                            yield return(attr);
                        }
                    }
                }
                yield break;
            }
            IMember member = entity as IMember;

            if (member != null)
            {
                HashSet <IMember> visitedMembers = new HashSet <IMember>();
                do
                {
                    member = member.MemberDefinition;                     // it's sufficient to look at the definitions
                    if (!visitedMembers.Add(member))
                    {
                        // abort if we seem to be in an infinite loop (cyclic inheritance)
                        break;
                    }
                    foreach (var attr in member.Attributes)
                    {
                        if (attributeTypePredicate(attr.AttributeType))
                        {
                            yield return(attr);
                        }
                    }
                } while (member.IsOverride && (member = InheritanceHelper.GetBaseMember(member)) != null);
                yield break;
            }
            throw new NotSupportedException("Unknown entity type");
        }
        internal static IEnumerable <IAttribute> GetAttributes(IMember member)
        {
            HashSet <IMember> visitedMembers = new HashSet <IMember>();

            do
            {
                member = member.MemberDefinition;                 // it's sufficient to look at the definitions
                if (!visitedMembers.Add(member))
                {
                    // abort if we seem to be in an infinite loop (cyclic inheritance)
                    break;
                }
                foreach (var attr in member.GetAttributes())
                {
                    yield return(attr);
                }
            } while (member.IsOverride && (member = InheritanceHelper.GetBaseMember(member)) != null);
        }