/* Copyright (C) 2008 - 2011 Jordan Marr This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library. If not, see . */ using System; using System.Collections; using System.Reflection; using Marr.Data.Reflection; namespace Marr.Data.Mapping { public class Relationship { public Relationship(MemberInfo member) : this(member, new RelationshipInfo()) { } public Relationship(MemberInfo member, IRelationshipInfo relationshipInfo) { Member = member; MemberType = ReflectionHelper.GetMemberType(member); // Try to determine the RelationshipType if (relationshipInfo.RelationType == RelationshipTypes.AutoDetect) { if (typeof(ICollection).IsAssignableFrom(MemberType)) { relationshipInfo.RelationType = RelationshipTypes.Many; } else { relationshipInfo.RelationType = RelationshipTypes.One; } } // Try to determine the EntityType if (relationshipInfo.EntityType == null) { if (relationshipInfo.RelationType == RelationshipTypes.Many) { if (MemberType.IsGenericType) { // Assume a Collection or List and return T relationshipInfo.EntityType = MemberType.GetGenericArguments()[0]; } else { throw new ArgumentException(string.Format( "The DataMapper could not determine the RelationshipAttribute EntityType for {0}.", MemberType.Name)); } } else { relationshipInfo.EntityType = MemberType; } } RelationshipInfo = relationshipInfo; Setter = MapRepository.Instance.ReflectionStrategy.BuildSetter(member.DeclaringType, member.Name); } public IRelationshipInfo RelationshipInfo { get; private set; } public MemberInfo Member { get; private set; } public Type MemberType { get; private set; } public bool IsLazyLoaded { get { return LazyLoaded != null; } } public ILazyLoaded LazyLoaded { get; set; } public GetterDelegate Getter { get; set; } public SetterDelegate Setter { get; set; } } }