【问题标题】:How do I Import types defined in a C# dictionary?如何导入 C# 字典中定义的类型?
【发布时间】:2018-09-13 21:33:53
【问题描述】:

当对象的属性是字典并且它的值是自定义类型时,我正在努力弄清楚如何生成我的 imports 行。

我的 DTO/C# 类定义如下。我的 .tst 文件中的 Imports 函数没有发现它需要导入 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;

}

【问题讨论】:

    标签: c# typescript typewriter


    【解决方案1】:

    来自 Typewriter 的创建者在此处发布: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());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-31
      • 2017-09-10
      • 2011-03-06
      • 1970-01-01
      • 2019-03-23
      • 2017-04-19
      • 1970-01-01
      • 2019-04-30
      相关资源
      最近更新 更多