Как импортировать типы, определенные в словаре C #? - PullRequest
0 голосов
/ 14 сентября 2018

Я изо всех сил пытаюсь выяснить, как сгенерировать мою строку imports, когда свойство объекта является словарем, а его значение является пользовательским типом.

Мой класс DTO / C # определен ниже.Функция Imports в моем файле .tst не обнаруживает необходимость импортировать тип Status, аналогично тому, как он импортировал ProjectDTO.

Есть ли способ получить тип значений словаря в файле .tst?

C # файл

[TypeScript]
public class ActiveProjectsViewModel
{
    public List<ProjectDTO> Projects { get; set; }

    public Dictionary<int,Status> Statuses { get; set; }

    public bool EditModeAvailable { get; set; }
}

.tst файл

 ${
string Imports(Class c)
        {
            var props = c.Properties.Where(p=>!p.Attributes.Any(a => String.Equals(a.name, "TypeScriptIgnore", StringComparison.OrdinalIgnoreCase)));

            IEnumerable<Type> types = props
                .Select(p => p.Type)
                .Where(t => !t.IsPrimitive || t.IsEnum)
                .Select(t => t.IsGeneric ? t.TypeArguments.First() : t)
                .Where(t => !t.Attributes.Any(a => String.Equals(a.name, "TypeScriptIgnore", StringComparison.OrdinalIgnoreCase)))
                .Distinct();

            return string.Join(Environment.NewLine, types.Select(t => $"import {{ {t.Name} }} from './{t.Name}';").Distinct());
        }
    }

    $Classes()[
    $Imports

    export class $Name {
        $Properties($PropertyIsNotIgnored)[        
        public $name: $Type = $Type[$Default];]
        $BaseClass[$Properties($PropertyIsNotIgnored)[
        public $name: $Type = $Type[$Default];]]
    }]


    $Enums(*)[
    export enum $Name {
        $Values[
        $Name = $Value][,]
    }]

Создает этот файл:

import { ProjectDTO } from './ProjectDTO';

export class ActiveProjectsViewModel {

    public projects: ProjectDTO[] = [];        

    public statuses: { [key: number]: Status; } = {};        

    public editModeAvailable: boolean = false;

}

1 Ответ

0 голосов
/ 17 сентября 2018

От создателя пишущей машинки, размещенного здесь: https://github.com/frhagn/Typewriter/issues/282 похоже, что тип, определенный в словаре, может быть получен с использованием подхода, описанного ниже.

Ключевой добавлена ​​строка SelectMany,

string Imports(Class c)
{
    var props = c.Properties.Where(p => !p.Attributes.Any(a => String.Equals(a.name, "TypeScriptIgnore", StringComparison.OrdinalIgnoreCase)));

    IEnumerable<Type> types = props
        .Select(p => p.Type)
        .SelectMany(t => t.IsGeneric ? t.TypeArguments : new[] { t } as IEnumerable<Type>)
        .Where(t => !t.IsPrimitive || t.IsEnum)
        .Where(t => !t.Attributes.Any(a => String.Equals(a.name, "TypeScriptIgnore", StringComparison.OrdinalIgnoreCase)))
        .Distinct();

    return string.Join(Environment.NewLine, types.Select(t => $"import {{ {t.Name} }} from './{t.Name}';").Distinct());
}
...