Peeveen.Utils 1.3.1

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

Peeveen.Utils

Some handy classes that I like to use.

DynamicConverter / DynamicCollectionConverter

Implementations of System.Text.Json.Serialization.JsonConverter<T> for the dynamic and dynamic[] types.

class MyClass {
	...

	[JsonInclude]
	[System.Text.Json.Serialization.JsonConverter(typeof(Peeveen.Utils.Dynamic.DynamicConverter))]
	public dynamic MyDynamicData { get; set; }

	[JsonInclude]
	[System.Text.Json.Serialization.JsonConverter(typeof(Peeveen.Utils.Dynamic.DynamicCollectionConverter))]
	public dynamic[] MyDynamicDataArray { get; set; }

	...
}

var result = JsonSerializer.Deserialize<MyClass>(json);
var val = result.MyDynamicData.some._dynamic.property.somewhere;

Alternatively, the more direct approach ...

var serializerOptions = new JsonSerializerOptions();
serializerOptions.Converters.Add(Peeveen.Utils.Dynamic.DynamicConverter.Instance); // or new() ...
serializerOptions.Converters.Add(Peeveen.Utils.Dynamic.DynamicCollectionConverter.Instance); // or new() ...
var deserializedDynamicData = JsonSerializer.Deserialize<dynamic>(rawJsonString, serializerOptions);
var dynamicProperty = deserializedDynamicData.some._dynamic.property.somewhere;

TODO

  • Parameterized constructor to define behavior surrounding date detection and smaller numeric data types.

DynamicUtilities

A static class with a few methods for working with dynamic data.

  • EvaluateExpression() allows for a string expression like x.y.z[2].blah to be evaluated against a dynamic object.
  • GetPropertyInfo() will return an array of objects describing the top-level properties of a dynamic object.
  • Flatten() will flatten all nested objects of a dynamic into top-level properties (optionally including arrays/lists), with property names made from a combination of parent property names using a custom separator.
  • Merge() will merge the properties of two objects into a new object.

MultiplexingAsyncEnumerable

A wrapper around an IAsyncEnumerable to allow for it to be consumed by multiple consumers, as long as you know how many consumers there are.

Depending on the implementation of any given IAsyncEnumerable, it may not support being enumerated multiple times (e.g. if it is reading directly from a network stream, or a database query). So if you want to provide the data to multiple consumers, your usual option is to first enumerate it to a concrete collection such as a List. This could be costly in terms of memory if there is a very large amount of data being enumerated.

This class uses a internal List buffer into which the enumerated elements are read, but:

  • An item is only added to the buffer when it is requested by a consumer that has already consumed all previously-buffered items.
  • Later consumers will received the buffered item(s).
  • Items are removed from the buffer as soon as all consumers have consumed them.
  • You can specify a maximum buffer limit to ensure that one consumer does not race ahead, filling the internal buffer with massive amounts of data and allocating large amounts of memory.
  • You can specify a minimum size that the buffer must reach before the implementation will attempt a tidy-up of consumed items (to prevent unnecessary processing "churn" at the expense of slightly higher memory usage).

ArrayExtensions

Extension functions for working with arrays.

  • ToMultidimensionalArray() will convert an array-of-arrays (of arrays, etc) to a multidimensional array. For example, it will convert an int[][][] to an int[,,].
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  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. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.3.1 156 11/2/2025
1.3.0 157 9/5/2025
1.2.0 163 9/5/2025
1.1.0 190 9/3/2025
1.0.0 176 9/2/2025