internal EFieldSelectorOption GetSelectorOption(Type type)
        {
            EFieldSelectorOption selectorOption = fieldSelectorOption;

            if (explicitTypes != null && explicitTypes.Contains(type))
            {
                selectorOption = EFieldSelectorOption.Explicit;
            }
            else if (implicitTypes != null && implicitTypes.Contains(type))
            {
                selectorOption = EFieldSelectorOption.Implicit;
            }
            return(selectorOption);
        }
        public static IEnumerable <ConfigTypeInfo> GatherTypeInfo(Type configType, ConfigOptions options)
        {
            FieldInfo[] fieldInfos = configType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);

            IEnumerable <ConfigTypeInfo> result = fieldInfos
                                                  .SelectMany(field => field.GetCustomAttributes <SerializationAttribute>()
                                                              .Select(attribute => new ConfigTypeInfo(field, attribute))
                                                              ).OrderBy(info => info.fieldSerializer.GetOrder());

            EFieldSelectorOption selectorOption = options.GetSelectorOption(configType);

            if (selectorOption == EFieldSelectorOption.Implicit)
            {
                result = result.Concat(
                    fieldInfos.Where(field => !Attribute.IsDefined(field, typeof(SerializationAttribute)))
                    .Select(field => new ConfigTypeInfo(field, ImplicitFieldSerializer.Instance()))
                    );
            }

            return(result);
        }