// remove the base type properties from the derived types. internal void RemoveBaseTypeProperties(StructuralTypeConfiguration derivedStructrualType, StructuralTypeConfiguration baseStructuralType) { IEnumerable <StructuralTypeConfiguration> typesToLift = new[] { derivedStructrualType } .Concat(this.DerivedTypes(derivedStructrualType)); foreach (PropertyConfiguration property in baseStructuralType.Properties .Concat(baseStructuralType.DerivedProperties())) { foreach (StructuralTypeConfiguration structuralType in typesToLift) { PropertyConfiguration derivedPropertyToRemove = structuralType.Properties.SingleOrDefault( p => p.PropertyInfo.Name == property.PropertyInfo.Name); if (derivedPropertyToRemove != null) { structuralType.RemoveProperty(derivedPropertyToRemove.PropertyInfo); } } } foreach (PropertyInfo ignoredProperty in baseStructuralType.IgnoredProperties()) { foreach (StructuralTypeConfiguration structuralType in typesToLift) { PropertyConfiguration derivedPropertyToRemove = structuralType.Properties.SingleOrDefault( p => p.PropertyInfo.Name == ignoredProperty.Name); if (derivedPropertyToRemove != null) { structuralType.RemoveProperty(derivedPropertyToRemove.PropertyInfo); } } } }
// Get all properties of this type (that are not already ignored). public static IEnumerable <PropertyInfo> GetAllProperties(StructuralTypeConfiguration type, bool includeReadOnly) { if (type == null) { throw Error.ArgumentNull("type"); } return(type .ClrType .GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) .Where(p => p.IsValidStructuralProperty() && !type.IgnoredProperties().Any(p1 => p1.Name == p.Name) && (includeReadOnly || p.GetSetMethod() != null || p.PropertyType.IsCollection()))); }