private IEnumerable <IRuleMapper> CreateRules(PropertyInfo[] sourceProperties, PropertyInfo[] destinyProperties) { var rules = new LinkedList <IRuleMapper>(); foreach (var destinyProperty in destinyProperties) { var rule = _rules.FirstOrDefault(x => x.Match(destinyProperty)); if (rule != null) { rules.AddLast(rule); continue; } var sourceProperty = sourceProperties.FirstOrDefault(x => x.Name == destinyProperty.Name); if (sourceProperty == null) { continue; } rules.AddLast(ForRuleFactory.CreateRule(destinyProperty, sourceProperty, _hashCodeFactoryGenerator)); } return(rules); }
/// <summary> /// Specific what property to property /// </summary> /// <typeparam name="TDestinyMember"></typeparam> /// <typeparam name="TSourceMember"></typeparam> /// <param name="destiny"></param> /// <param name="source"></param> /// <returns></returns> public virtual IMapperBuilder<TSource, TDestiny> For<TDestinyMember, TSourceMember>(Expression<Func<TDestiny, TDestinyMember>> destiny, Expression<Func<TSource, TSourceMember>> source) { if(destiny.Body.NodeType != ExpressionType.MemberAccess) { throw new NotSupportedException(); } if(source.Body.NodeType != ExpressionType.MemberAccess) { throw new NotImplementedException(); } var sourceProperty = ((source.Body as MemberExpression)!.Member as PropertyInfo)!; var destinyProperty = ((destiny.Body as MemberExpression)!.Member as PropertyInfo)!; _rules.Add(ForRuleFactory.CreateRule(destinyProperty, sourceProperty, _hashCodeFactoryGenerator)); return this; }