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

问题描述 投票:0回答:1

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

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

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

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

c# typescript visual-studio-2017 asp.net-core-mvc visual-studio-2019
1个回答
0
投票

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

首先创建此存储过程:

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或两者中查看结果

© www.soinside.com 2019 - 2024. All rights reserved.