コード例 #1
0
        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);
            }
        }