public static ITypeMapping CreateMapping(Type type, XElement element, IConvertCaseStrategy convertCaseStrategy)
        {
            var elementList   = element.Elements().ToList();
            var attributeList = element.Attributes().ToList();

            var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(p => p.CanWrite && p.GetSetMethod(true).IsPublic).ToList();

            ITypeMapping typeMapping = new TypeMapping();

            foreach (var item in properties)
            {
                var xName = convertCaseStrategy.ConvertCase(item.Name);

                var attribute = attributeList.Where(i => i.Name == xName).FirstOrDefault();
                if (attribute != null)
                {
                    var mappingAttributes = new MappingForAttributes(attribute, item);
                    typeMapping.Add(mappingAttributes);
                    continue;
                }

                var ele = elementList.Where(i => i.Name == xName).FirstOrDefault();
                if (ele != null)
                {
                    var mappinger      = MappingerSelector.Get(item.PropertyType, convertCaseStrategy);
                    var mappingElement = new MappingForElement(ele, item, mappinger);
                    typeMapping.Add(mappingElement);
                }
            }

            return(typeMapping);
        }
        /// <summary>
        /// Mapping配置实体类型。
        /// </summary>
        /// <param name="type"></param>
        /// <param name="element"></param>
        /// <returns></returns>
        public object Mapping(Type type, XElement element, IConvertCaseStrategy convertCaseStrategy)
        {
            // 获取mappinger选择器
            IMappinger mappinger = MappingerSelector.Get(type, convertCaseStrategy);

            convertCaseStrategy = convertCaseStrategy ?? new DefaultConvertCaseStrategy();

            // 如果不是entity,直接执行返回值
            if (!(mappinger is EntityMappinger))
            {
                mappinger.ConvertCaseStrategy = convertCaseStrategy;
                return(mappinger.Mapping(element, type));
            }


            // 创建实例
            var instance = Activator.CreateInstance(type);

            // 创建 mapping
            ITypeMapping typeMapping = MappingFactory.CreateMapping(type, element, convertCaseStrategy);

            // 执行
            typeMapping.Apply(instance);
            return(instance);
        }
        public static void Setting(string sectionName = null, string filePath = null, Func <string, string> funcConvertCase = null, Func <string, string, IConvertCaseStrategy, Section> funcSection = null)
        {
            IConvertCaseStrategy convertCaseStrategy =
                funcConvertCase == null
                ? (IConvertCaseStrategy) new DefaultConvertCaseStrategy()
                : new SettingConvertCaseStrategy(funcConvertCase);

            ISuperConfigStrategy superConfigStrategy =
                funcSection == null
                ? (ISuperConfigStrategy) new DefaultSuperConfigStrategy(convertCaseStrategy)
                : new SettingSuperConfigStrategy(convertCaseStrategy, funcSection);

            _T = _superConfigEngine.Mapping <T>(sectionName, filePath, superConfigStrategy);
        }
        /// <summary>
        /// 根据类型选择不同的Mappinger
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static IMappinger Get(Type type, IConvertCaseStrategy convertCaseStrategy)
        {
            var canMappingers = _mappingers.Where(i => i.IsCanMapping(type)).ToList();

            if (canMappingers.Count > 1)
            {
                throw new SuperConfigException($"出现多个Mapping选择器!");
            }

            IMappinger mappinger = canMappingers.Count == 0 ? new EntityMappinger() : canMappingers.First();

            mappinger.ConvertCaseStrategy = convertCaseStrategy;

            return(mappinger);
        }
 /// <summary>
 /// 获取配置信息
 /// </summary>
 /// <param name="element">XElement对象。</param>
 /// <returns></returns>
 public static T Mapping(XElement element, IConvertCaseStrategy convertCaseStrategy = null)
 {
     return((T)_superConfigEngine.Mapping(typeof(T), element, convertCaseStrategy));
 }
 public SettingSuperConfigStrategy(IConvertCaseStrategy convertCaseStrategy, Func <string, string, IConvertCaseStrategy, Section> funcSection)
 {
     _convertCaseStrategy = convertCaseStrategy;
     _funcSection         = funcSection;
 }
 public DefaultSuperConfigStrategy(IConvertCaseStrategy convertCaseStrategy)
 {
     _convertCaseStrategy = convertCaseStrategy;
 }