Example #1
0
        private void DepthBuild(BuildTreeNode <CustomBuildTreeNodeConfig> buildNode, PropertiesTreeNode newNode)
        {
            // Создаём другие node дерева.
            List <PropertiesTreeNode> newNodes = new List <PropertiesTreeNode>();

            foreach (var nodePair in buildNode.ChildNodes)
            {
                //string propName = nodePair.Key;
                //if (buildNode.Config.IgnoredProperties.Contains(propName))
                //    continue;

                var newInnerNode = new PropertiesTreeNode(nodePair.Value.Property);

                // Если это поле
                if (buildNode.Config.GoDepthProperties.Contains(newInnerNode.PropertyName))
                {
                    DifferenceSearchBuilderExtensions.AutoDepthBuild(newInnerNode.PropertyType, newInnerNode);
                }
                else
                {
                    DepthBuild(nodePair.Value, newInnerNode);
                }

                newNodes.Add(newInnerNode);
            }

            newNode.InnerProperties = buildNode.Config.NeedAllProperties
                ? buildNode.PropertyType.GetProperties()
                : buildNode.Config.SelectedProperties.ToArray();
            newNode.Nodes = newNodes.ToArray();
        }
Example #2
0
        private void DepthBuild(BuildTreeNode <AutoBuildTreeNodeConfig> buildNode, PropertiesTreeNode newNode)
        {
            PropertyInfo[] allTypeProperties = buildNode.PropertyType.GetProperties();

            // Исключаем все игнорируемые поля.
            PropertyInfo[] neededProperties = allTypeProperties
                                              .Where(info => !buildNode.Config.IgnoredProperties.Contains(info.Name)).ToArray();

            // Создаём другие node дерева.
            List <PropertiesTreeNode> newNodes = new List <PropertiesTreeNode>();

            foreach (var info in neededProperties)
            {
                // Если в build версии дерева есть node, тогда проходим по его правилам.
                if (buildNode.ChildNodes.ContainsKey(info.Name))
                {
                    if (buildNode.ChildNodes[info.Name].Config.IsDeadEnd)
                    {
                        continue;
                    }

                    var newInnerNode = new PropertiesTreeNode(info);
                    DepthBuild(buildNode.ChildNodes[info.Name], newInnerNode);
                    newNodes.Add(newInnerNode);
                }
                // Если в build версии дерева нету node, тогда запускаем полностью рефлексивный обход.
                else if (!info.PropertyType.IsSimple())
                {
                    var newInnerNode = new PropertiesTreeNode(info);
                    DifferenceSearchBuilderExtensions.AutoDepthBuild(info.PropertyType, newInnerNode);
                    newNodes.Add(newInnerNode);
                }
            }

            newNode.InnerProperties = neededProperties;
            newNode.Nodes           = newNodes.ToArray();
        }