Nano Hash - криптовалюты, майнинг, программирование

Есть ли собственный способ или через VS Extension для VS 2017/2019 для автоматического создания машинописных файлов .d из С# POCO

В моем файле Razor .cshtml мне нужно передать сериализованные данные JSON из некоторых сложных объектов модели C# POCO, которые можно использовать в пространстве Javascript. Но вместо этого я хочу использовать типобезопасный Typescript, который в VS 2017/2019 теперь имеет отличную поддержку (путем автоматической транспиляции во время сборки). Таким образом, я также могу использовать функции ES6.

Я ищу советы по созданию машинописных файлов .d, чтобы используемые мной машинописные сценарии имели преимущество проверки типов при работе с данными JSON, полученными из модели C# POCO.

Существует ответ SO, рекомендующий Web Essentials, но он не был обновлен для VS 2017/2019, и теперь я подозреваю, что VS 2017/2019 имеет встроенный Roslyn и поддерживает Typescript намного больше, чем VS 2015, я надеюсь, что он есть способ сделать это, не устанавливая никаких расширений и не требуя каких-либо библиотек nuget.

Я могу сгенерировать его вручную (возможно, щелкнув правой кнопкой мыши корневой класс POCO на вкладке обозревателя решений в среде IDE VS 2017/2019). Но что еще лучше, если создание файлов .d происходит автоматически, так что всякий раз, когда обновляется класс POCO C#, помощник по синтаксису в окне редактирования .ts обновляется автоматически. Я надеюсь, что встроенная функция Rosyln каким-то образом заставит его работать как по волшебству :-).


  • frhagn.github.io/Typewriter 05.12.2019
  • @Эми, спасибо. Я предпочитаю нативное решение VS2017/2019, но рассмотрю Typewriter в качестве запасного варианта. Я также нашел Генератор определений TypeScript. 05.12.2019
  • Я использую пишущую машинку последние пару лет и мне она очень нравится. Ваше здоровье. 05.12.2019

Ответы:


1

Поскольку объекты POCO часто представляют собой таблицы, у меня есть решение для создания классов на основе таблицы SQL в MS SQL Management Studio.

Сначала создайте этот хранимый процесс:

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 или обоих

05.12.2019
  • Я ценю ваш ответ, но он слишком тяжелый, связанный с SQL и т. д. Я настоятельно рекомендую расширение VS Studio Генератор определений TypeScript которые отлично работали для меня в последние несколько месяцев. 18.03.2020

  • 2

    Генератор определений TypeScript, расширение Visual Studio, отлично работает последние несколько месяцев. Он также работает для последнего обновления Visual Studio 2019 (начиная с версии 16.4.6).

    После установки вы можете указать файл POCO .cs, для которого вы хотите автоматически создать файл .ts.d, просто щелкнув его правой кнопкой мыши в обозревателе решений. С этого момента каждый раз, когда вы обновляете этот файл POCO .cs, связанный с ним файл .ts.d обновляется автоматически.

    При моем использовании я помещал несколько POCO в один файл .cs, поэтому мне нужно только щелкнуть правой кнопкой мыши несколько файлов, чтобы получить десятки нужных мне POCO.

    18.03.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..