Jakar.Extensions 10.11.1

dotnet add package Jakar.Extensions --version 10.11.1
                    
NuGet\Install-Package Jakar.Extensions -Version 10.11.1
                    
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="Jakar.Extensions" Version="10.11.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Jakar.Extensions" Version="10.11.1" />
                    
Directory.Packages.props
<PackageReference Include="Jakar.Extensions" />
                    
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 Jakar.Extensions --version 10.11.1
                    
#r "nuget: Jakar.Extensions, 10.11.1"
                    
#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 Jakar.Extensions@10.11.1
                    
#: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=Jakar.Extensions&version=10.11.1
                    
Install as a Cake Addin
#tool nuget:?package=Jakar.Extensions&version=10.11.1
                    
Install as a Cake Tool

Jakar.Extensions

Extensions and helpers for .NET 10: observable and concurrent collections, HTTP, files, security, async LINQ, span and hashing helpers, users and logins, and view models. It is trim and Native AOT compatible. Contributions and ideas are welcome.

Installation

dotnet add package Jakar.Extensions

It brings in Jakar.Json (JSON, including the [JsonModel] source generator) and Jakar.Spans (ValueStringBuilder and other span primitives).

JSON

Since 10.11 the library serializes with Jakar.Json only: source-generated readers and writers, no System.Text.Json, no Newtonsoft.Json and no reflection.

  • Models are [JsonModel] types (IJsonSerializable<TSelf>). Put [JsonModel] on a partial class, record or struct; the generator writes ToJson(), FromJson(json), TryFromJson, UTF-8 and stream overloads, and ISpanFormattable / ISpanParsable<TSelf>.

    [JsonModel]
    public sealed partial class Invoice : BaseClass<Invoice>
    {
        public decimal Total { get; init; }
    }
    
    Invoice invoice = Invoice.FromJson(json);
    string  text    = invoice.ToJson();
    
  • Generic helpers: Json.Serialize(value) / json.FromJson<T>() for models; Json.Serialize<T, TConverter> / Json.Deserialize<T, TConverter> for any other shape (e.g. JsonArrayConverter<string, JsonStringConverter>).

  • Root-level arrays: Json.Serialize(invoices), JsonCodec.FromJsonList<Invoice>(json), WebHandler.AsJsonList<Invoice>(token).

  • Untyped JSON is a JNode tree (JObjectNode, JArrayNode, JValueNode): json.FromJson(), and the helpers Get<T>, TryGet<T>, GetOrDefault<T>, As<T>, TryGetValue<T>, TryAdd, TryUpdate, Set.

  • Older JSON still reads. The library's models accept JSON written by 10.10 and earlier: case-insensitive property names, numbers in strings, comments and trailing commas ([assembly: JsonDefaults]). Declare the same JsonDefaults in your assembly for your own models.

Migrating from 10.10

  • IJsonModel<TSelf>, JsonTypeInfo, JsonSerializerContexts (JakarExtensionsContext, UserGuidJsonContext, UserLongJsonContext), Json.Options, Json.AddResolver and Json.GetTypeInfo are gone: put [JsonModel] on your types, and constrain generic code to IJsonSerializable<T>.
  • System.Text.Json attributes aren't read: [JsonIgnore] → [JsonSkip], [JsonConstructor] → [JsonCreator], [JsonRequired] → [JsonMandatory], [JsonPropertyName] → [JsonKey], [JsonExtensionData] → [JsonOverflow].
  • AdditionalData is a JObjectNode? (ordinal keys). ErrorResponse, FeedBackTrackerException, ExceptionDetails.Data and LoginRequestValue.Data use JNode / JObjectNode.
  • Output is Jakar.Json's layout, compact by default ({"Name" : "value"}); preference files are written indented.
  • PreferenceFile<TSelf> subclasses implement CopyFrom(TSelf loaded), which copies their declared preferences on load and reload.
  • AppVersion and Email are written as JSON strings (ISpanFormattable + ISpanParsable<T>); AppVersion.ToJson() / AppVersion.FromJson(json) remain.
  • Observable collections implement IJsonCollection<TSelf, T>: as [JsonModel] members they write their unfiltered contents and read in bulk. As a root, ToJson() / FromJson(json) need [JsonModel] elements; use ObservableJson.ToJson<TSelf, TValue, TConverter> for others.
  • LocalFile / LocalDirectory serialize as {"FullPath", "FileEncoding"} / {"FullPath"}; a plain path string no longer reads.
  • WebRequester: CreateJsonContent / CreateJsonArrayContent take Jakar.Json writer options; WebHandler.AsJson<T>, AsJsonArray<T> and AsJsonList<T> take no JsonTypeInfo.

Base classes

  • BaseClass / BaseClass<TSelf>: a model base with property change notifications (INotifyPropertyChanging, INotifyPropertyChanged), JSON extension data (AdditionalData), and equality and comparison for TSelf.
  • BaseRecord: the record counterpart, with JSON extension data.

Collections

  • Observable: ObservableCollection<T>, ConcurrentObservableCollection<T>, ObservableDictionary<TKey, TValue>, ObservableConcurrentDictionary<TKey, TValue>, ObservableHashSet<T>. They raise change notifications and can show a filtered view (OverrideFilter); the list types also keep a sort order (Comparer<T>).
  • Queues and stacks: ConcurrentDeque<T>, FixedSizedDeque<T>, FixedSizedQueue<T>, LockFreeDeque<T>, LockFreeStack<T>.
  • Other: ArrayBuffer<T> (a growable buffer struct), AsyncChannel<T>, ValueLinkedList<T>, MultiDict<TKey>.

HTTP

  • WebRequester: a wrapper around HttpClient that builds requests against a base URI (IHostInfo), with retries (RetryPolicy).
  • WebHandler: one request. Every As* call sends it, retries per the requester's policy, and returns a WebResponse<T>.
  • WebResponse<T>: the result: status, value or error details.
  • Status, MimeType, MimeTypeNames: HTTP status codes, MIME types and their names.

Files

  • LocalFile, LocalDirectory: read, write, create, delete and enumerate local files and directories.
  • LocalFileWatcher: an observable collection of a directory's files.
  • TempFile, EmbeddedResources, FilePaths.
  • PreferenceFile<TSelf>: typed preferences persisted as JSON.
  • IniConfig: parses and formats INI files.

Security

  • SecuredString: sensitive text kept in a SecureString.
  • PasswordValidator and PasswordRequirements: password rules and validation.
  • OneTimePassword: TOTP codes.
  • IDataProtector / IDataProtectorProvider / DataProtector: encrypt and decrypt data.

Errors

  • ErrorOrResult<T> and Error: a value or errors (inspired by ErrorOr).
  • ExceptionDetails: exceptions as serializable data.

Miscellaneous

  • Validate: string and state validation.
  • Tasks: task helpers such as SafeFireAndForget.
  • Types: type inspection (IsBuiltInType, IsNullableType, IsCollection, IsDictionary, IsList, IsSet, HasInterface, TryGetUnderlyingEnumType, MethodName, MethodSignature, ...).
  • LoginRequest, UserModel, JwtParser: users, logins and tokens.
  • AppVersion: application versions with formatting and parsing.
  • BaseViewModel and the Command / IAsyncCommand types: view models.
  • TelemetrySource, StopWatch: diagnostics.

Method lists

Many of these have several overloads.

  • AsyncLinq: Add, AddDefault, AddOrUpdate, AsAsyncEnumerable, Average, CastSafe, Consolidate, ConsolidateUnique, Enumerate, EnumeratePairs, First, FirstOrDefault, ForEach, ForEachAsync, ForEachParallel, ForEachParallelAsync, GetArray, IsEmpty, Last, LastOrDefault, Max, Min, Random, RandomKeys, RandomValues, Range, Remove, Single, SingleOrDefault, Sorted, ToArray, ToArrayBuffer, ToConcurrentObservableCollection, ToHashSet, ToImmutableArray, ToList, ToObservableCollection, TryAdd, WhenAllParallelAsync, WhereNotNull, WhereNotNullAsync.
  • Hashes: Concatenate, GetHash, Hash, Hash128, HashAsync, Hash_MD5, Hash_SHA1, Hash_SHA256, Hash_SHA384, Hash_SHA512, HashAsync_MD5, HashAsync_SHA1, HashAsync_SHA256, HashAsync_SHA384, HashAsync_SHA512, ToBytes, TryGetData. Also HashCodeU64 / HashCodeU128.
  • Types: Construct, GetNullabilityInfo, GetParameterInfo, HasInterface, IsAnyBuiltInType, IsBuiltInNullableType, IsBuiltInType, IsCollection, IsDictionary, IsDictionaryEntry, IsEqualType, IsGenericType, IsInitOnly, IsJsonNode, IsKeyValuePair, IsList, IsNullable, IsNullableType, IsOneOf, IsSet, MethodClass, MethodInfo, MethodName, MethodSignature, TryGetUnderlyingEnumType, TryGetUnderlyingType.
  • Spans: All, Any, As, AsArraySegment, AsBytes, AsImmutableArray, AsMemory, AsReadOnlyMemory, AsReadOnlySpan, AsSpan, Average, ClampEnd, ClampStart, Contains, ContainsAll, ContainsAny, ContainsExact, ContainsNone, ConvertToString, CopyTo, Count, Create, CreateSpan, EndsWith, Enumerate, First, FirstOrDefault, GetVectors, IsNullOrWhiteSpace, Join, Last, LastIndexOf, LastOrDefault, Max, Min, QuickSort, RefSelect, Remove, RemoveAll, Replace, Select, SequenceEqual, SequenceEqualAny, Single, SingleOrDefault, Slice, StartsWith, Sum, ToMemory, ToMemoryStream, ToReadOnlyMemory, Trim, TrimEnd, TrimStart, TryAsSegment, TryCopyTo, TryGetCount.

Versioning

Versions follow <.NET major>.<library major>.<library minor>: 10.10.0 targets .NET 10, library major 10, minor 0. See the repository README.

License

MIT. See LICENSE.txt. Contributions are welcome: open an issue or a pull request on GitHub.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (5)

Showing the top 5 NuGet packages that depend on Jakar.Extensions:

Package Downloads
Jakar.Database

Package Description

Jakar.Extensions.Blazor

Extensions to aid in development.

Jakar.Shapes

Extensions to aid in development.

Jakar.Extensions.Serilog

Extensions to aid in development.

Jakar.SqlBuilder

Easy Sql Building

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
10.11.1 115 10/25/2026
10.11.0 99 10/24/2026
10.10.0 167 10/17/2026
10.9.3 208 8/26/2026
10.9.1 161 7/2/2026
10.9.0 161 6/19/2026
10.8.3 204 3/11/2026
10.8.2 167 3/11/2026
10.8.1 172 3/11/2026
10.8.0 175 3/2/2026
10.7.0 171 2/17/2026
10.6.0 183 2/16/2026
10.5.0 196 2/4/2026
10.4.1 196 2/2/2026
10.4.0 187 2/2/2026
10.3.4 197 1/28/2026
10.3.3 207 1/22/2026
10.3.2 195 1/22/2026
10.3.1 202 1/21/2026 10.3.1 is deprecated because it has critical bugs.
10.3.0 178 1/21/2026
Loading failed

10.10.0: ValueStringBuilder and Sizes moved to the new dependency Jakar.Spans (same namespace, type-forwarded, so no source or binary change); Jakar.Spans adds ValueUtf8Builder and ValueSpanReader<T>. BREAKING: System.Text.Json replaces Newtonsoft.Json; the library is trim and Native AOT compatible (source-generated metadata only). New dependency Jakar.Json (IJsonModel<TSelf>, the [JsonModel] source generator and analyzers, pooled element-wise JSON arrays, SerializeAsStringJsonConverter<T>, plus the Jakar.Json serializer, which [JsonModel] uses behind IJsonModel when it supports the type: most models' ToJson/FromJson now run on it, laid out as Jakar.Json writes ("name" : value) with the context's options mirrored; JsonTypeInfo stays System.Text.Json's); types stay in the Jakar.Extensions namespace. IJsonModel<TSelf> requires static JsonTypeInfo (add [JsonModel]). JToken/JObject/JValue removed: AdditionalData is Dictionary<string, JsonElement>?, ErrorResponse/WebHandler.AsJson/FeedBackTrackerException use JsonNode, ExceptionDetails.Data is JsonObject, LoginRequestValue uses JsonElement. Json.Settings/LoadSettings replaced by Json.Options/AddResolver/GetTypeInfo; generic ToJson<T>(this T) only for IJsonModel types (else Json.Serialize). Typed JsonNode/JsonElement get/add/update/remove helpers. JSON written by 10.x still reads (case-insensitive names, numbers in strings, comments, trailing commas); output keeps PascalCase. PreferenceFile stores {TSelf}.json and imports an existing .ini. Observable collections serialize their unfiltered contents and read in bulk. LocalFile/LocalDirectory serialize as {"FullPath"}. ExceptionDetails(Exception, bool) became Create / CreateWithMethodInfo. WebRequester: AsJson(JsonTypeInfo), AsJsonArray/AsJsonList, BaseClass bodies serialized as their runtime type. Fixes: Json.ToJson(ReadOnlySpan) serialized the whole pooled rental; LocalFile.WriteAsync(string) wrote empty files; LoginRequest copy constructors passed the login as the password; Email.TryParse returned the inverse; GcInfo did not deserialize MemoryInfo. Removed the unused ValueOf package. 10.11.0: BREAKING: built on Jakar.Json 10.3.0, which no longer has System.Text.Json: the library serializes with Jakar.Json only. IJsonModel<TSelf>, the System.Text.Json contexts (JakarExtensionsContext, UserGuidJsonContext, UserLongJsonContext), Json.Options/AddResolver/GetTypeInfo and every JsonTypeInfo overload are removed: models are [JsonModel] types (IJsonSerializable<TSelf>), and generic helpers are constrained to IJsonSerializable<T> or take an IJsonConverter<T> (Json.Serialize<T, TConverter> / Json.Deserialize<T, TConverter>). JsonNode/JsonElement/JsonObject became Jakar.Json's JNode/JObjectNode: AdditionalData (JObjectNode?, ordinal keys, [JsonOverflow]), ErrorResponse, FeedBackTrackerException, ExceptionDetails.Data, LoginRequestValue.Data, IniConfig.ToJsonObject/FromJsonObject and the typed get/add/update helpers; the JsonElement helpers are gone. Output uses Jakar.Json's layout, compact by default; preference files are written indented. PreferenceFile<TSelf> subclasses implement CopyFrom(TSelf). AppVersion is no longer a [JsonModel] (it is written as a JSON string, as before; ToJson/FromJson remain). Observable collections: the System.Text.Json converters are removed; IJsonCollection<TSelf, T> covers [JsonModel] members, root ToJson/FromJson need [JsonModel] elements (or ObservableJson.ToJson/FromJson with a converter). LocalFile/LocalDirectory no longer read a plain path string. WebRequester.CreateJsonContent/CreateJsonArrayContent take JsonWriterOptions, and CreateJsonContentOfRuntimeType resolves the type with JsonCodecRegistry. Jakar.Json's attributes are kept in this assembly's metadata (JAKAR_JSON_KEEP_ATTRIBUTES), so [JsonModel] types in other assemblies see [JsonOverflow] on BaseClass.AdditionalData. New: NullAsEmptyArrayConverter<T, TConverter>; StringTags reads missing or null Tags/Entries as empty. BREAKING: IIObservableCollection<TValue> renamed to IObservableCollection<TValue>. BREAKING: Command<TValue> now follows CommunityToolkit.Mvvm AsyncRelayCommand<T> semantics and implements the new IAsyncCommand<TValue>: ExecutionTask, IsRunning, CanBeCanceled, IsCancellationRequested (with PropertyChanged), ExecuteAsync returning Task, Cancel(), NotifyCanExecuteChanged() (CanExecute no longer raises CanExecuteChanged itself), CommandOptions (AllowConcurrentExecutions, FlowExceptionsToTaskScheduler), CreateCancelCommand(); CanExecute is false while running by default; starting a cancellable handler cancels the previous token; Execute rethrows handler failures on the calling context unless FlowExceptionsToTaskScheduler; object parameters of the wrong type throw ArgumentException. Command<TValue>.Executable accepts CancellationToken-taking handlers, adds Execute(object?, TValue?, CancellationToken), is 16 bytes instead of 72, and no longer drops the Task from Func<TValue?, Task> handlers (it is now awaited). Fixed SelfLogger.WriteLine throwing FormatException for named template holes such as {Error}. Internal folder restructure. Removed the unused Portable.BouncyCastle dependency and System.* package references that are part of the net10.0 shared framework. 10.11.1: Fixed ArrayBuffer<T>.Create / ToArrayBuffer() on sources that cannot report their count (e.g. after Order()): the result held 64 slots padded with default values instead of exactly the source's items. 10.10.0: TelemetrySource uses W3C activity IDs: the process-wide hierarchical default is gone and the StartActivity idFormat default is now Unknown (default parameter values are compiled into call sites, so recompile callers). StartActivity respects the sampler: it returns null instead of throwing when sampled out, no longer forces IsAllDataRequested, the Recorded trace flag (traceFlags is now ActivityTraceFlags?) or Ok status, and keeps the parent tracestate. Constructing a TelemetrySource no longer clears Activity.Current. AppVersion has a TypeConverter, so it binds from configuration strings. TelemetrySpan can target a specific TelemetrySource via TelemetrySpan.Create(TelemetrySource, string).