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); }
/// <summary> /// Gets the descriminator for the class type. /// </summary> /// <param name = "classType">Type of the entity.</param> /// <returns></returns> public object GetDiscriminator(Type classType) { return(_profile.GetDiscriminator(classType)); }