Exemplo n.º 1
0
        string MapComplexType(Type type)
        {
            if (_processedTypes.TryGetValue(type, out var name))
            {
                return(name);
            }

            name = _opts.DtoClassNamingPolicy(type);
            name = name.Split('`')[0];
            if (_usedNames.Contains(name))
            {
                throw new InvalidProgramException(name + " is already in use");
            }
            _processedTypes[type] = name;

            var code     = new TypescriptCodeBuilder();
            var typeInfo = type.GetTypeInfo();

            if (typeInfo.IsInterface || typeInfo.IsClass)
            {
                var tsName = name;
                if (typeInfo.IsGenericTypeDefinition)
                {
                    tsName = name +
                             "<" + string.Join(",", type.GetGenericArguments().Select(a => a.Name)) + ">";
                }

                code.BeginInterface(tsName);
                foreach (var p in type.GetProperties())
                {
                    var typeName = MapType(p.PropertyType);
                    code.AppendInterfaceProperty(_opts.DtoFieldNamingPolicy(p.Name), typeName);
                }

                code.End();
            }
            else if (typeInfo.IsEnum)
            {
                code.BeginEnum(name);
                foreach (var en in Enum.GetNames(type))
                {
                    code.AppendEnumValue(en, en);
                }
                code.End();
            }
            else
            {
                throw new InvalidProgramException($"Don't know how to convert {type.FullName} to typescript");
            }

            _builder.AppendLine(code.ToString());
            return(name);
        }