Reo.Core.Analyzers
10.0.360
dotnet add package Reo.Core.Analyzers --version 10.0.360
NuGet\Install-Package Reo.Core.Analyzers -Version 10.0.360
<PackageReference Include="Reo.Core.Analyzers" Version="10.0.360"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
<PackageVersion Include="Reo.Core.Analyzers" Version="10.0.360" />
<PackageReference Include="Reo.Core.Analyzers"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
paket add Reo.Core.Analyzers --version 10.0.360
#r "nuget: Reo.Core.Analyzers, 10.0.360"
#:package Reo.Core.Analyzers@10.0.360
#addin nuget:?package=Reo.Core.Analyzers&version=10.0.360
#tool nuget:?package=Reo.Core.Analyzers&version=10.0.360
Reo.Core.Analyzers
Описание пакета
Reo.Core.Analyzers — это набор Roslyn-анализаторов для C#, предназначенный для улучшения качества кода,
обеспечения соблюдения стандартов и выявления потенциальных проблем в проектах на .NET. Пакет включает в себя
анализаторы, которые проверяют:
- Соблюдение соглашений о коде (например, использование атрибутов
ExcludeFromCodeCoverage). - Корректное применение расширений (например, замена
Task.WhenAllнаWhenAllAsync). - Использование интерфейсов для аудита и даты (например,
ICreateAuditSecure,IUpdateDate). - Производительность (например, вынесение вызовов методов из циклов).
- Правильное применение LINQ и коллекций (например, использование
Any()вместо проверки длины).
Пакет помогает разработчикам избегать распространённых ошибок, улучшать читаемость кода и соответствовать внутренним стандартам проекта.
Основные компоненты
| Компонент | Описание |
|---|---|
| Reo.CodeConventions | Анализаторы, проверяющие соблюдение соглашений о коде (например, использование ExcludeFromCodeCoverage для методов, не подлежащих покрытию тестами). |
| Reo.Extensions | Анализаторы, выявляющие неправильное использование методов расширения (например, замена IsNullOrEmpty на IsNotNullOrEmpty). |
| Reo.Linq | Анализаторы, улучшающие использование LINQ (например, замена проверки длины коллекции на Any()). |
| Reo.Performance | Анализаторы, выявляющие потенциальные проблемы производительности (например, вызовы методов внутри циклов). |
| Reo.Types | Анализаторы, проверяющие корректное наследование от интерфейсов (например, ICreateAuditSecure, IUpdateDate). |
Установка
Установите пакет через NuGet Package Manager или .NET CLI:
Install-Package Reo.Core.Analyzers
dotnet add package Reo.Core.Analyzers
Настройка
Начиная с версии *.0.31277, код фиксы и анализаторы, поставляемые в составе пакетов Reo.Core, получили поддержку использования настроек, задающих правила изменения программного кода. Данные настройки передаются по средствам дополнительного файла, задаваемого в файле *.csproj, и должен иметь имя Reo.Analyzers.json.
Для того, чтобы задать файл настроек, следует добавить в файл проекта следующие строки:
<ItemGroup>
<AdditionalFiles Include="Reo.Analyzers.json"/>
</ItemGroup>
Пример актуального файла Reo.Analyzers.json
Общие параметры секций конфигурации Все нижепредставленные секции (исключая XmlDoc и UsedImplicitly) конфигурации имеют следующие общие свойства:
{
"Annotations": {
"CaseInsensitiveAllowedCategories": [
"resharper"
]
},
"XmlDoc": {
"Types": {
"CancellationToken": "Токен отмены операции",
"System.TimeProvider": "Сервис работы с датой и временем"
},
"PropertiesOrParameters": {
"inn": "ИНН",
"kpp": "КПП",
"id": "Идентификатор",
"ids": "Идентификаторы",
"name": "Наименование",
"names": "Наименования"
},
"Methods": {},
"InheritdocIgnoreTypes": [
"IEnumerable",
"IDisposable",
"IAsyncDisposable",
"IEntityGuidId"
],
"InheritdocIgnoreNamespaces": [
"Reo.Core.BaseDomainModels",
"MassTransit"
]
},
"PerformanceLoopAnalyzerConfig": {
"Types": [
"HttpClient",
"IReoHttpClient",
"ICryptographicMessageSyntaxV1",
"IMongoDatabase",
"IMongoCollection",
"ISequenceGeneratorClient",
"ITessaClientApi"
],
"Namespaces": [
"Reo.Core.Elastic",
"Reo.Clients.FileStorage",
"Reo.Core.NoSql"
]
},
"DDD": {
"ModelTypes": [
"IReoDomainModel",
"IReoValueObject"
],
"IgnoreTypes": [
"ReoAggregateRoot"
],
"ValueObjectType": "IReoValueObject"
},
"DateTime": {
"IgnoreBaseTypes": [
"AutoMapper.Profile"
]
},
"UsedImplicitly": {
"BaseTypes": [
"IAsyncMessageHandler"
]
},
"CancellationTokenParameter": {
"IgnoreTypes": [
"EnumerableExtensions"
]
},
"CodeStyle": {
"IgnoreBaseTypes": [
"AutoMapper.Profile"
]
},
"Controllers": {
"AuthorizationAnnotationsAndNamespaces": {
"Authorize": "Microsoft.AspNetCore.Authorization",
"AllowAnonymous": "Microsoft.AspNetCore.Authorization",
"AllAuthorizePolicyFrom": "Reo.Core.Auth.Attributes",
"AnyAuthorizePolicyFrom": "Reo.Core.Auth.Attributes"
}
},
"Testing": {
"Replace": [
{
"From": "UserInfo.Create",
"To": "TestingUserInfoFactory.CreateUserInfo"
}
]
},
"ObsoleteMigrator": {
"Replace": [
{
"From": {
"FullNameClass": "System.DateTime",
"MemberName": "Now"
},
"To": {
"FullNameClass": "System.TimeProvider",
"MemberName": "GetUtcNow"
},
"Result": "%INJECTED_OBJECT%.%MEMBER%()"
}
]
}
}
REO04005
Анализатор замены выражений согласно правилам, определенным в конфигурационном файле Описание: Анализирует вызовы каждого метода или выражения доступа к свойству объекта, проверяя наличие соответствующего ему правила в конфигурационном файле.
Код диагностики: REO04005
Сообщение: Выражение %ИсходноеВыражение% следует заменить на выражение %ЦелевоеВыражение%
Исправление: Производит замену выражения, согласно найденному в конфигурации правилу.
Описание правил замены выражений
Правила замены описываются в коллекции Replace, специальной секции конфигурационного файла ObsoleteMigrator.
{
"ObsoleteMigrator": {
"Replace": [
{
"From": {
"FullNameClass": "Microsoft.Extensions.DependencyInjection.IServiceCollection",
"MemberName": "AddInitializeDatabase"
},
"To": {
"FullNameClass": "Reo.Core.Database.DataBaseExtensions",
"MemberName": "AddReoDatabase<MyDbContext>"
},
"Result": "%OBJECT%.%MEMBER%($configuration, $configuration.GetConnectionString(TODO))"
}
]
}
}
| Имя | Тип | Обязательность | Описание |
|---|---|---|---|
| TypesDefinitions | Словарь (строка, строка) | - | Описывает псевдонимы типов, которые могут быть использованы в шаблоне результирующего выражения. Представляет собой соответствие произвольного псевдонима и полного имени типа. |
| From | объект | + | Описывает выражение, требующего замены. Его члены: FullNameClass - полное имя типа, содержащего целевой член класса; MemberName - имя целевого члена класса. |
| To | объект | + | Описывает выражение, на которое требуется произвести замену. Его члены: FullNameClass - полное имя типа, содержащего целевой член класса; MemberName - имя целевого члена класса. |
| Result | строка | + | Шаблон результирующего выражения. |
Шаблон результирующего выражения
Представляет собой произвольную строку, описывающую, каким образом должно выглядеть результирующее выражение, посредствам значений специальных зарезервированных слов.
Применительно к вызовам методов, также может быть осуществлена подстановка аргументов исходного метода.
Зарезервированные слова
| Зарезервированное слово | Подставляемое в результирующий вызов значение |
|---|---|
| %INJECTED_OBJECT% | Имя объекта целевого типа, поиск которого будет производится в приватных полях класса. В случае если такой объект не был найден, будет осуществлена его инъекция через конструктор |
| %OBJECT% | Имя объекта, к члену класса которого производится доступ |
| %TYPE% | Имя целевого типа, в котором содержится новый метод |
| %MEMBER% | Имя целевого члена класса |
Могут быть использованы в произвольном месте строки шаблона результирующего выражения.
Подстановка аргументов из заменяемого вызова
При построении результирующего выражения вызова, была предусмотрена возможность переноса аргументов из вызова заменяемого метода. Для этого строится соответствие между именами параметров заменяемого метода и передаваемых ему аргументов. При задании в шаблоне результирующего выражения вызова имени параметра вида $ИмяПараметра, в результирующий вызов будет подставлен аргумент, передаваемый в качестве этого параметра.
Проиллюстрируем это на примере.
Пусть необходимо произвести замену следующего вызова метода:
serviceCollection.AddInitializeDatabase<MyDbContext>(configuration, builder => builder.EnableDetailedErrors(), ServiceLifetime.Singleton);
Сигнатура этого метода выглядит следующим образом:
public static IServiceCollection AddInitializeDatabase<TDbContext>(
this IServiceCollection services,
IConfiguration configuration,
[NotNull] Action<DbContextOptionsBuilder> optionsAction,
ServiceLifetime contextLifetime = ServiceLifetime.Scoped)
Тогда, в данном случае, список доступных для использования в шаблоне параметров будет таким:
| Параметр, используемый в шаблоне | Значение, которое будет подставлено |
|---|---|
| $services | serviceCollection |
| $configuration | configuration |
| $optionsAction | builder ⇒ builder.EnableDetailedErrors() |
| $contextLifetime | ServiceLifetime.Singleton |
Псевдонимы типов
Используются для задания произвольного имени типа, объект которого требуется поместить в результирующий вызов. В шаблоне результирующего вызова псевдонимы типов имеют запись вида #ПсевдонимТипа.
Когда найдена такая запись, алгоритм ищет первый параметр, тип которого совпадает с псевдонимом метода, где находится заменяемый вызов.
Если же такой параметр не был найден, он будет добавлен в список параметров этого метода.
Найденный или добавленный параметр будет использован в шаблоне, на месте использования псевдонима типа.
Пример
До замены:
services.AddInitializeDatabase<MyDbContext>(configuration, builder => builder.EnableDetailedErrors(), ServiceLifetime.Singleton);
После замены:
services.AddReoDatabase<MyDbContext>(configuration, configuration.GetConnectionString(TODO));
Использование
Пример 1: Использование метода расширения вместо логического выражения
Проблемный код:
if (collection == null || collection.Count == 0)
{
// ...
}
Рекомендация:
if (collection.IsNullOrEmpty())
{
// ...
}
Анализатор EnumerableCheckDiagnosticId предложит заменить проверку на IsNullOrEmpty().
Пример 2: Замена Task.WhenAll на WhenAllAsync
Проблемный код:
await Task.WhenAll(tasks);
Рекомендация:
await tasks.WhenAllAsync();
Анализатор WhenAllAsyncExtensionMethodInvocationExpectedDiagnosticId предложит использовать метод расширения
WhenAllAsync().
Пример 3: Использование Any() вместо проверки длины
Проблемный код:
if (collection.Count > 0)
{
// ...
}
Рекомендация:
if (collection.Any())
{
// ...
}
Анализатор EnumerableLengthCheckDiagnosticId предложит заменить проверку на Any().
Лицензия
Данный пакет распространяется под лицензией MIT.
Learn more about Target Frameworks and .NET Standard.
This package has no dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on Reo.Core.Analyzers:
| Repository | Stars |
|---|---|
|
vknet/vk
Vkontakte API for .NET
|
| Version | Downloads | Last Updated |
|---|---|---|
| 10.0.360 | 44 | 9/14/2026 |
| 10.0.359 | 41 | 9/14/2026 |
| 10.0.358 | 42 | 9/14/2026 |
| 10.0.357 | 38 | 9/14/2026 |
| 10.0.356 | 40 | 9/14/2026 |
| 10.0.355 | 41 | 9/14/2026 |
| 10.0.354 | 54 | 9/14/2026 |
| 10.0.353 | 74 | 9/14/2026 |
| 10.0.352 | 76 | 9/14/2026 |
| 10.0.351 | 78 | 9/14/2026 |
| 10.0.350 | 84 | 9/11/2026 |
| 10.0.347 | 121 | 9/8/2026 |
| 10.0.346 | 88 | 9/8/2026 |
| 10.0.345 | 109 | 9/8/2026 |
| 10.0.344 | 108 | 9/7/2026 |
| 10.0.343 | 103 | 9/7/2026 |
| 10.0.342 | 108 | 9/4/2026 |
| 10.0.341 | 101 | 9/3/2026 |
| 10.0.340 | 124 | 9/1/2026 |
| 10.0.339 | 86 | 9/1/2026 |