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
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Reo.Core.Analyzers" Version="10.0.360">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Reo.Core.Analyzers" Version="10.0.360" />
                    
Directory.Packages.props
<PackageReference Include="Reo.Core.Analyzers">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Reo.Core.Analyzers --version 10.0.360
                    
#r "nuget: Reo.Core.Analyzers, 10.0.360"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Reo.Core.Analyzers@10.0.360
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Reo.Core.Analyzers&version=10.0.360
                    
Install as a Cake Addin
#tool nuget:?package=Reo.Core.Analyzers&version=10.0.360
                    
Install as a Cake Tool

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.

There are no supported framework assets in this package.

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
Loading failed