예제 #1
0
 private TypeContext(CachedType type, TypeContext context)
 {
     Type = type;
     IsRoot = context.IsRoot;
     Format = context.Format;
     Options = context.Options;
     Mode = context.Mode;
 }
예제 #2
0
        public static string DefaultConvention(TypeContext context)
        {
            var type = context.Type.IsNullable ? context.Type.UnderlyingType : context.Type;
            var kind = type.GetKind(
                context.Options.TreatEnumerableImplsAsObjects,
                context.Options.TreatDictionaryImplsAsObjects);

            if (kind.IsSimple()) return type.Name;

            var name = type.GetAttribute<XmlRootAttribute>().PipeWhen(context.IsRoot)
                    .MapOrDefault(x => x.ElementName).PipeWhen(x => !x.IsEmpty()) ??
                type.GetAttribute<XmlTypeAttribute>()
                    .MapOrDefault(x => x.TypeName).PipeWhen(x => !x.IsEmpty());
            if (name != null) return name;

            if (kind.IsDictionary())
            {
                var itemTypeName = context.Options.DefaultItemTypeName ?? (!type.IsGenericDictionary ? DefaultItemTypeName :
                    DefaultConvention(context.OfType(type.GenericDictionaryTypes.Value)));
                return (context.Options.DictionaryTypeNameFormat ?? DefaultDictionaryNameFormat).ToFormat(itemTypeName);
            }

            if (kind.IsEnumerable())
            {
                var itemTypeName = DefaultItemTypeName;
                if (context.Options.DefaultItemTypeName != null) itemTypeName = context.Options.DefaultItemTypeName;
                else if (type.IsArray) itemTypeName = DefaultConvention(context.OfType(type.ElementType));
                else if (type.IsGenericEnumerable) itemTypeName = DefaultConvention(
                    context.OfType(type.GenericEnumerableType));
                return (context.Options.EnumerableTypeNameFormat ?? DefaultEnumerableNameFormat).ToFormat(itemTypeName);
            }

            if (type.IsGenericType)
                return (context.Options.GenericTypeNameFormat ?? DefaultGenericTypeNameFormat)
                    .ToFormat(type.GenericBaseName, type.GenericArguments.Aggregate(x =>
                        DefaultConvention(context.OfType(x))));

            return type.Name;
        }