From e272b5e618bdd5b8a99300941d872b6f6ed754d1 Mon Sep 17 00:00:00 2001 From: Erlend Ellefsen Date: Wed, 15 Apr 2026 09:55:54 +0200 Subject: [PATCH] refactor: adopt C# 14 language features --- .../Controllers/JsonApiController.cs | 12 +++--------- .../Projection/DynamicTypeBuilder.cs | 18 +++++++++--------- JsonApiToolkit/Extensions/StringExtensions.cs | 4 ++-- 3 files changed, 14 insertions(+), 20 deletions(-) diff --git a/JsonApiToolkit/Controllers/JsonApiController.cs b/JsonApiToolkit/Controllers/JsonApiController.cs index df9ed06..227c8cc 100644 --- a/JsonApiToolkit/Controllers/JsonApiController.cs +++ b/JsonApiToolkit/Controllers/JsonApiController.cs @@ -28,29 +28,23 @@ namespace JsonApiToolkit.Controllers; [ServiceFilter(typeof(JsonApiExceptionFilter))] public abstract class JsonApiController : ControllerBase { - private ILogger? _logger; - private IJsonApiQueryParser? _queryParser; - private JsonApiOptions? _options; - /// /// Gets the logger instance. /// protected ILogger Logger => - _logger ??= HttpContext.RequestServices.GetRequiredService>(); + field ??= HttpContext.RequestServices.GetRequiredService>(); /// /// Gets the query parser service. /// protected IJsonApiQueryParser QueryParser => - _queryParser ??= HttpContext.RequestServices.GetRequiredService(); + field ??= HttpContext.RequestServices.GetRequiredService(); /// /// Gets the configured JsonApiOptions. /// protected JsonApiOptions Options => - _options ??= HttpContext - .RequestServices.GetRequiredService>() - .Value; + field ??= HttpContext.RequestServices.GetRequiredService>().Value; /// /// Parses JSON:API query parameters (filter, sort, page, include). diff --git a/JsonApiToolkit/Extensions/Projection/DynamicTypeBuilder.cs b/JsonApiToolkit/Extensions/Projection/DynamicTypeBuilder.cs index ea060c3..3116de6 100644 --- a/JsonApiToolkit/Extensions/Projection/DynamicTypeBuilder.cs +++ b/JsonApiToolkit/Extensions/Projection/DynamicTypeBuilder.cs @@ -9,19 +9,19 @@ namespace JsonApiToolkit.Extensions.Projection; /// internal static class DynamicTypeBuilder { - private static readonly AssemblyBuilder s_assemblyBuilder; - private static readonly ModuleBuilder s_moduleBuilder; - private static readonly object s_buildLock = new(); - private static int s_typeCounter; + private static readonly AssemblyBuilder _assemblyBuilder; + private static readonly ModuleBuilder _moduleBuilder; + private static readonly Lock _buildLock = new(); + private static int _typeCounter; static DynamicTypeBuilder() { var assemblyName = new AssemblyName("JsonApiToolkit.Projections"); - s_assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly( + _assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly( assemblyName, AssemblyBuilderAccess.Run ); - s_moduleBuilder = s_assemblyBuilder.DefineDynamicModule("MainModule"); + _moduleBuilder = _assemblyBuilder.DefineDynamicModule("MainModule"); } /// @@ -30,12 +30,12 @@ static DynamicTypeBuilder() internal static Type Build(IEnumerable<(string Name, Type PropertyType)> properties) { // ModuleBuilder is not thread-safe; serialize type creation - lock (s_buildLock) + lock (_buildLock) { - int id = ++s_typeCounter; + int id = ++_typeCounter; string typeName = $"JsonApiProjection_{id}"; - TypeBuilder typeBuilder = s_moduleBuilder.DefineType( + TypeBuilder typeBuilder = _moduleBuilder.DefineType( typeName, TypeAttributes.Public | TypeAttributes.Class diff --git a/JsonApiToolkit/Extensions/StringExtensions.cs b/JsonApiToolkit/Extensions/StringExtensions.cs index df21805..b2de766 100644 --- a/JsonApiToolkit/Extensions/StringExtensions.cs +++ b/JsonApiToolkit/Extensions/StringExtensions.cs @@ -13,7 +13,7 @@ public static string ToCamelCase(this string str) if (string.IsNullOrEmpty(str) || !char.IsUpper(str[0])) return str; - return char.ToLowerInvariant(str[0]) + str.Substring(1); + return char.ToLowerInvariant(str[0]) + str[1..]; } /// @@ -24,6 +24,6 @@ public static string ToPascalCase(this string str) if (string.IsNullOrEmpty(str)) return str; - return char.ToUpperInvariant(str[0]) + str.Substring(1); + return char.ToUpperInvariant(str[0]) + str[1..]; } }