コード例 #1
0
        private static IDictionary <string, object> GetDataFromNode(ConfigItemNode nodeItem)
        {
            var result = new ExpandoObject() as IDictionary <string, object>;

            foreach (var propertyItem in nodeItem.Properties)
            {
                object tmpValue = propertyItem.Value;
                //是列表对象
                if (propertyItem.Value is ObservableCollection <object> listData)
                {
                    tmpValue = GetListData(listData);
                }

                result.Add(propertyItem.Descriptor.PropertyName, tmpValue);
            }

            if (nodeItem.SubNodes != null)
            {
                foreach (var subNode in nodeItem.SubNodes)
                {
                    var subNodeObj = GetDataFromNode(subNode);
                    result.Add(subNode.Descriptor.PropertyName, subNodeObj);
                }
            }
            return(result);
        }
コード例 #2
0
        private static ConfigItemNode GetNode(object configItem, DescriptorInfo descriptor)
        {
            ConfigItemNode result = new ConfigItemNode
            {
                Properties = new ObservableCollection <ConfigItemProperty>(),
                SubNodes   = new ObservableCollection <ConfigItemNode>()
            };

            var propertyInfos = configItem.GetType().GetProperties(BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Instance);

            foreach (var pInfo in propertyInfos)
            {
                var setter = pInfo.GetSetMethod();
                if (setter == null)
                {
                    continue;
                }
                var value           = pInfo.GetValue(configItem);
                var valueDescriptor = GetOrCreateDescriptorInfo(pInfo.Name, pInfo.PropertyType, descriptor.PropertyDescriptors,
                                                                pInfo.GetCustomAttribute(typeof(DescriptorAttribute)) as DescriptorAttribute);
                if (IsValue(pInfo.PropertyType, out bool isList))
                {
                    //property
                    if (value == null && isList)
                    {
                        //构造默认list
                        value = valueDescriptor.DefaultValue ?? new ObservableCollection <object>();
                    }

                    if (isList)
                    {
                        value = ConvertToListValue(value, valueDescriptor);
                    }

                    ConfigItemProperty tmpP = null;
                    if (isList)
                    {
                        tmpP = new ListItemProperty();
                    }
                    else
                    {
                        tmpP = new ConfigItemProperty();
                    }

                    tmpP.Descriptor = valueDescriptor;
                    tmpP.Value      = value;

                    if (value == null && valueDescriptor.DefaultValue != null)
                    {
                        //没有值,就使用默认值
                        tmpP.Value = valueDescriptor.DefaultValue;
                    }
                    result.Properties.Add(tmpP);
                }
                else
                {
                    //node
                    if (value == null)
                    {
                        value = Activator.CreateInstance(pInfo.PropertyType);
                    }
                    var subPropertyTypes = value.GetType().GetProperties(BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Instance);
                    var tmpNode          = GetNode(value, valueDescriptor);
                    result.SubNodes.Add(tmpNode);
                }
            }
            //拷贝,不破坏元对象。只需要保留当前级的信息,节约内存
            string oldPropertyName = descriptor.PropertyName;

            descriptor = DeepClone(descriptor);
            //因为propertyName没有 setter,所以需要重新复制
            DescriptorInfo.SetPropertyName(oldPropertyName, descriptor);
            result.Descriptor = descriptor;
            return(result);
        }