在我的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功能可以使它像魔术般工作:-)。
由于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或两者中查看结果