在我的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功能可以使它像魔术般工作:-)。
答案 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。