Peeveen.Utils
1.3.1
dotnet add package Peeveen.Utils --version 1.3.1
NuGet\Install-Package Peeveen.Utils -Version 1.3.1
<PackageReference Include="Peeveen.Utils" Version="1.3.1" />
<PackageVersion Include="Peeveen.Utils" Version="1.3.1" />
<PackageReference Include="Peeveen.Utils" />
paket add Peeveen.Utils --version 1.3.1
#r "nuget: Peeveen.Utils, 1.3.1"
#:package Peeveen.Utils@1.3.1
#addin nuget:?package=Peeveen.Utils&version=1.3.1
#tool nuget:?package=Peeveen.Utils&version=1.3.1
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 likex.y.z[2].blahto be evaluated against adynamicobject.GetPropertyInfo()will return an array of objects describing the top-level properties of adynamicobject.Flatten()will flatten all nested objects of adynamicinto 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 anint[][][]to anint[,,].
| Product | Versions 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. |
-
.NETStandard 2.0
- Microsoft.CSharp (>= 4.7.0)
- System.Text.Json (>= 9.0.8)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.