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); }