是否有VS 2017/2019原生方法从C#POCO自动生成Typescript .d文件

时间:2019-12-05 19:19:58

标签: c# typescript visual-studio-2017 asp.net-core-mvc visual-studio-2019

在我的Razor .cshtml文件中,我需要传递来自一些复杂的C#POCO模型对象的JSON序列化数据,这些对象可以在Javascript空间中使用。但是我想改用类型安全的Typescript,VS 2017/2019现在具有强大的支持(通过在构建过程中自动转换)。这样,我还可以使用ES6功能。

我正在寻找有关生成Typescript .d文件的技巧,因此在处理从C#POCO模型派生的JSON数据时,我使用的Typescript脚本具有类型检查的好处。

SO answer推荐Web Essentials,但尚未在VS 2017/2019中进行更新,我现在怀疑VS 2017/2019内置Roslyn并支持Typescript远远超过了VS 2015,我希望它能够做到这一点而无需安装任何扩展程序或不需要任何nuget库。

我可以手动生成它(可以通过在VS 2017/2019 IDE内的“解决方案资源管理器”选项卡上右键单击POCO根类)。但是,如果.d文件的生成是自动的,那就更好了,以便每当更新C#POCO类时,.ts编辑窗口中的语法帮助程序都会自动更新。我希望集成的Rosyln功能可以使它像魔术般工作:-)。

2 个答案:

答案 0 :(得分:0)

由于POCO对象通常代表表,因此我有解决方案,可以在MS SQL Management Studio中基于SQL表创建类。

首先创建此存储的proc:

CREATE PROC [dbo].[CreateClass](
    @Schema VARCHAR(100),
    @TableName VARCHAR(100),
    @Type VARCHAR(2) = NULL

)
AS
IF @Type IS NULL
    SET @Type = 'T'

SET NOCOUNT ON
DECLARE @TableInfo TABLE (
    ColumnName VARCHAR(100),
    ColumnPosition INT,
    ColumnTypeCS VARCHAR(100),
    ColumnTypeTS VARCHAR(100),
    NullableSign CHAR(1)
)

INSERT INTO @TableInfo
    SELECT 
        replace(COLUMN_NAME, ' ', '_') ,
        ORDINAL_POSITION AS ColumnPosition,
        CASE DATA_TYPE
            WHEN 'bigint' THEN 'long'
            WHEN 'binary' THEN 'byte[]'
            WHEN 'bit' THEN 'bool'
            WHEN 'char' THEN 'string'
            WHEN 'date' THEN 'DateTime'
            WHEN 'datetime' THEN 'DateTime'
            WHEN 'datetime2' THEN 'DateTime'
            WHEN 'datetimeoffset' THEN 'DateTimeOffset'
            WHEN 'decimal' THEN 'decimal'
            WHEN 'float' THEN 'double'
            WHEN 'image' THEN 'byte[]'
            WHEN 'int' THEN 'int'
            WHEN 'money' THEN 'decimal'
            WHEN 'nchar' THEN 'string'
            WHEN 'ntext' THEN 'string'
            WHEN 'numeric' THEN 'decimal'
            WHEN 'nvarchar' THEN 'string'
            WHEN 'real' THEN 'double'
            WHEN 'smalldatetime' THEN 'DateTime'
            WHEN 'smallint' THEN 'short'
            WHEN 'smallmoney' THEN 'decimal'
            WHEN 'text' THEN 'string'
            WHEN 'time' THEN 'TimeSpan'
            WHEN 'timestamp' THEN 'DateTime'
            WHEN 'tinyint' THEN 'byte'
            WHEN 'uniqueidentifier' THEN 'Guid'
            WHEN 'varbinary' THEN 'byte[]'
            WHEN 'varchar' THEN 'string'
            ELSE 'UNKNOWN_' + DATA_TYPE
        END AS ColumnTypeCS,
        CASE DATA_TYPE
            WHEN 'bigint' THEN 'number'
            WHEN 'binary' THEN 'any'
            WHEN 'bit' THEN 'boolean'
            WHEN 'char' THEN 'string'
            WHEN 'date' THEN 'Date'
            WHEN 'datetime' THEN 'Date'
            WHEN 'datetime2' THEN 'Date'
            WHEN 'datetimeoffset' THEN 'Date'
            WHEN 'decimal' THEN 'number'
            WHEN 'float' THEN 'number'
            WHEN 'image' THEN 'any'
            WHEN 'int' THEN 'number'
            WHEN 'money' THEN 'number'
            WHEN 'nchar' THEN 'string'
            WHEN 'ntext' THEN 'string'
            WHEN 'numeric' THEN 'number'
            WHEN 'nvarchar' THEN 'string'
            WHEN 'real' THEN 'number'
            WHEN 'smalldatetime' THEN 'Date'
            WHEN 'smallint' THEN 'number'
            WHEN 'smallmoney' THEN 'number'
            WHEN 'text' THEN 'string'
            WHEN 'time' THEN 'number'
            WHEN 'timestamp' THEN 'number'
            WHEN 'tinyint' THEN 'number'
            WHEN 'uniqueidentifier' THEN 'string'
            WHEN 'varbinary' THEN 'any'
            WHEN 'varchar' THEN 'string'
            ELSE 'UNKNOWN_' + DATA_TYPE
        END ColumnTypeTS,
        CASE 
            WHEN IS_NULLABLE = 'YES' and DATA_TYPE in ('bigint', 'bit', 'date', 'datetime', 'datetime2', 'datetimeoffset', 'decimal', 'float', 'int', 'money', 'numeric', 'real', 'smalldatetime', 'smallint', 'smallmoney', 'time', 'tinyint', 'uniqueidentifier') 
            THEN '?' 
            ELSE '' 
        END NullableSign
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = @TableName AND TABLE_SCHEMA = @Schema 


DECLARE @Result VARCHAR(MAX) = 'public class ' + @TableName + '
{'

SELECT @Result = @Result + '
    public ' + ColumnTypeCS + NullableSign + ' ' + ColumnName + ' { get; set; }
'
FROM @TableInfo
ORDER BY ColumnPosition

SET @Result = @Result  + '
}'

IF CHARINDEX('C', @Type) > 0
    PRINT @Result


UPDATE @TableInfo
    SET ColumnName = LOWER(SUBSTRING(ColumnName, 1, 1)) + SUBSTRING(ColumnName, 2, LEN(ColumnName))

SET @Result = '
export interface I' + @TableName + '
{'

SELECT @Result = @Result + '
    '+ColumnName + '?: ' + ColumnTypeTS + ';'
FROM @TableInfo
ORDER BY ColumnPosition

SET @Result = @Result  + '
}
'

IF CHARINDEX('T', @Type) > 0
    PRINT @Result


SET @Result = '
export class ' + @TableName + ' implements I'+@TableName+'
{'

SELECT @Result = @Result + '
    '+ColumnName + '?: ' + ColumnTypeTS + ';'
FROM @TableInfo
ORDER BY ColumnPosition

SET @Result = @Result  + '

    constructor(recoverFrom: '+@TableName+' | I'+@TableName+') {
        super(recoverFrom);
    }
}
'
PRINT @Result
GO

要使用,只需执行

EXEC dbo.CreateClass @Schema = 'dbo', @TableName = 'MyTable', @Type = 'T'
or
EXEC dbo.CreateClass @Schema = 'dbo', @TableName = 'MyTable', @Type = 'C'
or
EXEC dbo.CreateClass @Schema = 'dbo', @TableName = 'MyTable'

,然后以C#,Typescript或两者同时查看结果

答案 1 :(得分:0)

TypeScript Definition Generator是Visual Studio扩展,在过去的几个月中一直运行良好。它也适用于最新的Visual Studio 2019更新(自版本16.4.6起)。

安装完成后,只需在解决方案资源管理器中右键单击POCO .cs文件,即可为其指定要自动生成.ts.d文件的文件。从那时起,每次更新该POCO .cs文件时,关联的.ts.d文件都会自动更新。

在我的用法中,我将几个POCO放在一个.cs文件中,因此我只需要右键单击几个文件即可找到我需要的数十个POCO。