/// <summary> /// Adds the sub class map. /// </summary> /// <param name = "subClassMap">The sub class map.</param> internal void AddSubClassMap(SubClassMap subClassMap) { _subClassMaps.Add(subClassMap); subClassMap.SuperClassMap = this; }
private SubClassMap CreateSubClassMap(Type classType, Func<Type, IClassMap> classMapFinder){ //TODO: should probably do something different to find the base type //mabe a convention? var superClassMap = classMapFinder(classType.BaseType); if(superClassMap == null) throw new InvalidOperationException(string.Format("Unable to find super class map for subclass {0}", classType)); var subClassMap = new SubClassMap(classType); ((ClassMapBase)superClassMap).AddSubClassMap(subClassMap); var discriminator = _profile.GetDiscriminator(classType); var parentDiscriminator = superClassMap.Discriminator; if(parentDiscriminator == null) subClassMap.Discriminator = discriminator; else { Array array; if(parentDiscriminator.GetType().IsArray) array = Array.CreateInstance(typeof(object), ((Array)parentDiscriminator).Length + 1); else { array = Array.CreateInstance(typeof(object), 2); array.SetValue(parentDiscriminator, 0); } array.SetValue(discriminator, array.Length - 1); subClassMap.Discriminator = array; } foreach(var member in _profile.FindMembers(classType)) { if(subClassMap.HasId && subClassMap.IdMap.MemberName == member.Name) continue; if(subClassMap.HasExtendedProperties && subClassMap.ExtendedPropertiesMap.MemberName == member.Name) continue; if(superClassMap.GetMemberMapFromMemberName(member.Name) != null) continue; //don't want to remap a member subClassMap.AddMemberMap(CreateMemberMap(classType, member)); } return subClassMap; }