c# - Генерация DTO из параметров метода? - PullRequest
1 голос
/ 19 июня 2020

Допустим, у меня есть следующий метод:

 public async Task<IList<AnalysisResult>> GetAnalysis(short year, bool unPlanned = false,
     Guid? departmentId = null, Guid? personnelId = null, CollarColor? collarColor = null,Guid? factoryId = null)
{
    ...
}

Список параметров метода довольно длинный и сложный в управлении. Это один из самых легких.

Я хочу автоматически преобразовать эти списки параметров в классы DTO.

Например:

Если я приведу пример вышеупомянутого метода :

public class GetAnalysisPayload
{
    public short Year {get;set;}
    public bool UnPlanned {get;set;}
    public Guid? DepartmentId {get;set;}
    ...
}

Я использовал эту функцию ReSharper, продукта JetBranins, но приложение зависло и закрылось без ответа. Хотя я повторял это много раз, решить проблему не удалось. У кого-нибудь еще есть идея?

1 Ответ

0 голосов
/ 19 июня 2020

Вот мой метод «грязно, но немного помоги», в основном это регулярные выражения.

! Ответ в процессе, просто экономя время от времени, чтобы избежать пугающей кнопки возврата

1: clean: format

Убедитесь, что все объявления находятся в по одной строке на функцию, IMO, который поможет разобраться в этом.

ввод:

 public async Task<IList<AnalysisResult>> GetAnalysis(short year, bool unPlanned = false,
     Guid? departmentId = null, Guid? personnelId = null, CollarColor? collarColor = null,Guid? factoryId = null)
{
    ...
}

 public async Task<IList<AnalysisResult>> GetOtherStuff(string foo = "bar", bool foobar = false, Guid? factoryId = null)
{
    ...
}

REGEX: ,\r\n

REPLACE BY: ,

output :

 public async Task<IList<AnalysisResult>> GetAnalysis(short year, bool unPlanned = false,     Guid? departmentId = null, Guid? personnelId = null, CollarColor? collarColor = null,Guid? factoryId = null)
{
    ...
}

 public async Task<IList<AnalysisResult>> GetOtherStuff(string foo = "bar", bool foobar = false, Guid? factoryId = null)
{
    ...
}

2: дополнительная очистка: фильтрация и создание отдельных файлов

Для этого необходимо работать в выделенной папке.

Возьмите исходный файл из результата выше. В приведенном ниже скрипте это «input.cs»

. Возьмем только строки, начинающиеся с «publi c» или «publi c asyn c Task», если они все асинхронные * 1065. *.

Создайте сценарий типа filter.ps1

$regex = "^\s*public async Task[^(]*\s+([^(]+)" #capture the name of the function, i.e. the part before the opening parenthesis and space after Task<... type
get-content input.cs | % { if($_ -match $regex) {Set-Content -Path "$($matches[1])Payload.cs" -Value $_ } }

и выполните его в папке, где присутствуют только сценарий и файл input.cs.

Отказ от ответственности : в приведенном выше коде, я полагаю, у вас нет скобок или пробела в типе возвращаемого значения функции ! Это могло произойти, если у вас есть некий общий метод c с несколькими параметрами типа или кортежи.

вывод: 2 отдельных файла, GetAnalysisPayload.cs и GetOtherStuffPayload.cs, каждый со строкой объявления функции.

3: грамотно разделить каждую строку

Разделить на ( и ,, с некоторым умным форматом, который сначала даст «заголовок класса DTO» и список параметров.

(необходимо указать код regex / powershell)

Это может стать беспорядочным в зависимости от того, что у вас есть на этом этапе, но если функции похожи на ваш пример, это может дать вам довольно близкое приближение к тому, что вам нужно на этом этапе уже ..

Затем

Со временем (пару часов?) я бы отполировал это с помощью сценария Powershell или C# консольного приложения, чтобы сохранить вам часть «неизбежная» оставшаяся ручная работа.

, например, добавьте операторы «using», необходимые в верхней части каждого файла.

Я цитирую «неизбежно», потому что об этом говорят ночью что некоторые мастера Regex эта работа может выполняться только с регулярными выражениями.

...