private static void ExtractAliases(ModelConfigurationNode node, CompositionPerformer performer, List <KeyValuePair <Expression, Expression> > aliases) { if (node.GetMutators().Any()) { var conditionalSetters = performer.GetConditionalSetters(node.Path); if (conditionalSetters != null && conditionalSetters.Count == 1) { var setter = conditionalSetters.Single(); if (setter.Value == null) { var chains = setter.Key.CutToChains(true, true); if (chains.Length == 1) { var chain = chains.Single(); aliases.Add(new KeyValuePair <Expression, Expression>(node.Path, chain)); if (IsEachOrCurrent(node.Path)) { aliases.Add(new KeyValuePair <Expression, Expression>(Expression.Call(MutatorsHelperFunctions.CurrentIndexMethod.MakeGenericMethod(node.Path.Type), node.Path), Expression.Call(MutatorsHelperFunctions.CurrentIndexMethod.MakeGenericMethod(chain.Type), chain))); } } } } } else if (IsEachOrCurrent(node.Path)) { var conditionalSetters = performer.GetConditionalSetters(((MethodCallExpression)node.Path).Arguments.Single()); if (conditionalSetters != null && conditionalSetters.Count == 1) { var setter = conditionalSetters.Single(); if (setter.Value == null) { var chains = setter.Key.CutToChains(true, true); if (chains.Length == 1) { var chain = chains.Single(); chain = Expression.Call(MutatorsHelperFunctions.CurrentMethod.MakeGenericMethod(chain.Type.GetItemType()), chain); aliases.Add(new KeyValuePair <Expression, Expression>(Expression.Call(MutatorsHelperFunctions.CurrentIndexMethod.MakeGenericMethod(node.Path.Type), node.Path), Expression.Call(MutatorsHelperFunctions.CurrentIndexMethod.MakeGenericMethod(chain.Type), chain))); } } } } foreach (var child in node.Children) { ExtractAliases(child, performer, aliases); } }