Omnifactotum 0.9.0
See the version list below for details.
dotnet add package Omnifactotum --version 0.9.0
NuGet\Install-Package Omnifactotum -Version 0.9.0
<PackageReference Include="Omnifactotum" Version="0.9.0" />
paket add Omnifactotum --version 0.9.0
#r "nuget: Omnifactotum, 0.9.0"
// Install Omnifactotum as a Cake Addin #addin nuget:?package=Omnifactotum&version=0.9.0 // Install Omnifactotum as a Cake Tool #tool nuget:?package=Omnifactotum&version=0.9.0
Omnifactotum
Provides own helper and functional classes and interfaces as well as extension methods for the standard .NET types.
Note: Factotum
is a Latin word literally meaning "do everything" (that is, a handyman or Jack-of-all-trades).
Changes in 0.9.0 (since 0.8.0)
Breaking Changes
ByReferenceEqualityComparer<T>
class: Enforced theclass
constraint onT
DirectedGraphNode<T>
: Removed the parameterless constructor overload and applied the corresponding default value in the remaining constructorEnumFixedSizeDictionaryDeterminant<TKey>
: TheSize
property becameprotected
as per inheritance (used to bepublic
)EnumFixedSizeDictionary<TKey, TValue, TDeterminant>
: The constructor previously acceptingIDictionary<TKey, TValue>
now acceptsIEnumerable<KeyValuePair<TKey, TValue>>
(as per inheritance)FixedSizeDictionary<TKey, TValue, TDeterminant>
andEnumFixedSizeDictionary<TKey, TValue>
now implementIReadOnlyDictionary<TKey, TValue>
Factotum.ProcessRecursively<T>()
method: Removed overloads not having theRecursiveProcessingContext<T>
parameter and applied the default value for this parameter in the other overloadsFixedSizeDictionaryDeterminant<TKey>
: TheSize
property becameprotected
(used to bepublic
)FixedSizeDictionary<TKey, TValue, TDeterminant>
: The constructor previously acceptingIDictionary<TKey, TValue>
now acceptsIEnumerable<KeyValuePair<TKey, TValue>>
KeyedEqualityComparer<T, TKey>
: Removed the constructor without the key comparer parameter and applied the default value to the key comparer parameter in the remaining constructorOmnifactotumDateTimeExtensions
: Added thevalueExpression
parameter to theEnsureKind()
,EnsureUtc()
, andEnsureLocal()
methods- For .NET 5+ and higher, the
valueExpression
parameter is marked withCallerArgumentExpression
- For older .NET versions, the
valueExpression
parameter is supplied only for binary compatibility between the different target frameworks
- For .NET 5+ and higher, the
OmnifactotumEnumExtensions
: Made methods generic and enforced theEnum
constraint on:GetName()
GetQualifiedName()
GetFullName()
IsDefined()
EnsureDefined()
CreateEnumValueNotImplementedException()
CreateEnumValueNotSupportedException()
OmnifactotumEnumExtensions
: Added theenumerationValueExpression
parameter to theEnsureDefined<TEnum>()
method- For .NET 5+ and higher, the
enumerationValueExpression
parameter is marked withCallerArgumentExpression
- For older .NET versions, the
enumerationValueExpression
parameter is supplied only for binary compatibility between the different target frameworks
- For .NET 5+ and higher, the
OmnifactotumGenericObjectExtensions
: Removed theToPropertyString<T>()
methodsOmnifactotumGenericObjectExtensions
: Added thevalueExpression
parameter to theEnsureNotNull<T>()
methods- For .NET 5+ and higher, the
valueExpression
parameter is marked withCallerArgumentExpression
- For older .NET versions, the
valueExpression
parameter is supplied only for binary compatibility between the different target frameworks
- For .NET 5+ and higher, the
OmnifactotumUriExtensions
: Added thevalueExpression
parameter to theEnsureAbsoluteUri()
andEnsureWebUri()
methods- For .NET 5+ and higher, the
valueExpression
parameter is marked withCallerArgumentExpression
- For older .NET versions, the
valueExpression
parameter is supplied only for binary compatibility between the different target frameworks
- For older .NET versions, the
- For .NET 5+ and higher, the
RecursiveProcessingContext<T>
class: Removed the parameterless constructor and applied the default value for the parameter in the parameterized constructorSyncValueContainer<T>
: Removed parameterless constructor- Validation types: Marked Validation attributes non-CLS compliant (as per compiler warnings)
BaseValidatableMemberAttribute
ValidatableMemberAttribute
BaseMemberConstraintAttribute
MemberConstraintAttribute
MemberItemConstraintAttribute
ValueContainer<T>
: Removed parameterless constructor -VirtualTreeNode.Create<T>
method: Added optional parameterIReadOnlyCollection<VirtualTreeNode<T>>? children
VirtualTreeNode<T>
: Replaced all constructors with singleVirtualTreeNode(T value, IReadOnlyCollection<VirtualTreeNode<T>>? children = null)
VirtualTreeNodeBase<T>
: Redesigned constructors and made the remaining constructor non visible outside assembly (private protected
)VirtualTreeNodeRoot<T>
: Replaced all constructors with singleVirtualTreeNodeRoot(IReadOnlyCollection<VirtualTreeNode<T>>? children = null)
WeakReferenceBasedCache<TKey, TValue>
- Applied the
notnull
constraint on theTKey
type parameter - Removed the constructor overload without the
IEqualityComparer<TKey>? keyEqualityComparer
parameter and applied the corresponding default value in the remaining constructor
- Applied the
New features
- Added support of .NET 6
- Enabled Nullable Reference Types for all the types across the entire project (except
Omnifactotum.Annotations.*
) ComparableObjectBase
: ImplementedIComparable
OmnifactotumCollectionExtensions
: Added theChunk<TSource>(this IEnumerable<TSource> source, int size)
extension method to use with .NET versions prior to 6.0- Added
OmnifactotumNullableEnumExtensions
:CreateEnumValueNotImplementedException<TEnum>()
CreateEnumValueNotSupportedException<TEnum>()
OmnifactotumStringExtensions
:- Added the
TrimPostfix()
method - Added the
TrimPrefix()
method
- Added the
- Added
VirtualTreeNodeRoot
static helper class - Validation:
- Added
EnumValueDefinedConstraint<TEnum>
constraint - Added
NullableEnumValueDefinedConstraint<TEnum>
constraint
- Added
Minor updates and fixes
- Applied
AggressiveInlining
(orAggressiveInlining
andAggressiveOptimization
), where appropriate, in:ComparableObjectBase
DirectedGraphNode
EquatableObjectBase
KeyedEqualityComparer
OmnifactotumDateTimeExtensions
OmnifactotumDisposableExtensions
OmnifactotumEnumExtensions
OmnifactotumHashCodeHelper
OmnifactotumMathExtensions
OmnifactotumMethodBaseExtensions
OmnifactotumNullableBooleanExtensions
OmnifactotumOperationContextExtensions
OmnifactotumSetExtensions
OmnifactotumTypeExtensions
OmnifactotumUriExtensions
ValueRange
ValueRange<T>
- Improved annotations in:
ComparableValueCapsule<T>
EnumFactotum
EquatableValueCapsule<T>
Factotum
OmnifactotumArrayExtensions
OmnifactotumDictionaryExtensions
OmnifactotumEnumExtensions
OmnifactotumExpressionExtensions
OmnifactotumHashCodeHelper
OmnifactotumMathExtensions
OmnifactotumMethodBaseExtensions
OmnifactotumNullableBooleanExtensions
OmnifactotumOperationContextExtensions
OmnifactotumTypeExtensions
ReadOnlySet<T>
ValueRange
ValueRange<T>
- Minor optimizations in
Factotum.SetDefaultValues<T>()
OmnifactotumAssemblyExtensions.GetLocalPath()
More details
Dealing with Compatibility Issues
Due to certain inconsistencies between .NET Standard 2.0
and .NET Core 2.x
, you may need to apply one or more workarounds as described below when using Omnifactotum
with your projects compiled for .NET Standard 2.0
or .NET Core 2.x
-or- a mix of .NET Standard 2.0
and/or .NET Core 2.x
and/or .NET Framework 4.x
:
Omnifactotum's Class or Method | Workaround |
---|---|
System.Collections.Generic.KeyValuePair |
Use Omnifactotum.OmnifactotumKeyValuePair . |
<code>OmnifactotumCollectionExtensions.ToHashSet(...)</code> | Use static method invocation instead of extension method invocation. That is: OmnifactotumCollectionExtensions.ToHashSet(collection) instead of collection.ToHashSet() . |
<code>OmnifactotumDictionaryExtensions.GetValueOrDefault</code> | Use static method invocation instead of extension method invocation. That is: OmnifactotumDictionaryExtensions.GetValueOrDefault(dictionary) instead of dictionary.GetValueOrDefault() . |
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 is compatible. net5.0-windows was computed. net6.0 is compatible. 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. |
.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 is compatible. |
.NET Framework | net461 is compatible. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 is compatible. 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. |
-
.NETFramework 4.6.1
- System.Collections.Immutable (>= 5.0.0)
- System.Threading.Tasks.Extensions (>= 4.5.4)
-
.NETFramework 4.7.2
- System.Collections.Immutable (>= 5.0.0)
- System.Threading.Tasks.Extensions (>= 4.5.4)
-
.NETStandard 2.0
- System.Collections.Immutable (>= 5.0.0)
- System.Threading.Tasks.Extensions (>= 4.5.4)
-
.NETStandard 2.1
- System.Collections.Immutable (>= 5.0.0)
-
net5.0
- No dependencies.
-
net6.0
- No dependencies.
NuGet packages (2)
Showing the top 2 NuGet packages that depend on Omnifactotum:
Package | Downloads |
---|---|
Omnifactotum.Wpf
Omnifactotum.Wpf is the ultimate solution for WPF .NET developers who want to streamline their development process. It provides its own helper and functional types as well as the extension methods for the standard .NET types. It's the perfect way to reduce errors and save time, allowing developers to focus on creating quality code. |
|
Omnifactotum.NUnit
Omnifactotum.NUnit: Provides helper and functional classes for testing with NUnit. |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
0.22.0 | 472 | 9/3/2024 |
0.20.0 | 509 | 5/23/2024 |
0.19.0 | 534 | 2/15/2024 |
0.18.0 | 568 | 1/2/2024 |
0.17.0 | 749 | 10/18/2023 |
0.16.0 | 998 | 6/23/2023 |
0.15.0 | 769 | 6/1/2023 |
0.14.1 | 871 | 5/1/2023 |
0.14.0 | 930 | 3/20/2023 |
0.13.0 | 887 | 3/10/2023 |
0.12.0 | 954 | 2/2/2023 |
0.11.0 | 1,195 | 1/2/2023 |
0.10.0 | 1,134 | 9/30/2022 |
0.9.0 | 1,038 | 9/19/2022 |
0.8.0 | 1,257 | 5/30/2022 |
0.7.0 | 1,135 | 12/27/2021 |
0.6.0 | 1,173 | 11/15/2021 |
0.5.0 | 1,106 | 9/21/2021 |
0.4.1 | 927 | 5/31/2021 |
0.4.0 | 861 | 5/25/2021 |
0.3.0.119 | 3,610 | 7/7/2015 |
0.3.0.114 | 1,710 | 3/23/2015 |
0.3.0.101 | 1,935 | 12/10/2014 |
### Changes in 0.9.0 (since 0.8.0)
#### Breaking Changes
- `ByReferenceEqualityComparer<T>` class: Enforced the `class` constraint on `T`
- `DirectedGraphNode<T>`: Removed the parameterless constructor overload and applied the corresponding default value in the remaining constructor
- `EnumFixedSizeDictionaryDeterminant<TKey>`: The `Size` property became `protected` as per inheritance (used to be `public`)
- `EnumFixedSizeDictionary<TKey, TValue, TDeterminant>`: The constructor previously accepting `IDictionary<TKey, TValue>` now accepts `IEnumerable<KeyValuePair<TKey, TValue>>` (as per inheritance)
- `FixedSizeDictionary<TKey, TValue, TDeterminant>` and `EnumFixedSizeDictionary<TKey, TValue>` now implement `IReadOnlyDictionary<TKey, TValue>`
- `Factotum.ProcessRecursively<T>()` method: Removed overloads not having the `RecursiveProcessingContext<T>` parameter and applied the default value for this parameter in the other overloads
- `FixedSizeDictionaryDeterminant<TKey>`: The `Size` property became `protected` (used to be `public`)
- `FixedSizeDictionary<TKey, TValue, TDeterminant>`: The constructor previously accepting `IDictionary<TKey, TValue>` now accepts `IEnumerable<KeyValuePair<TKey, TValue>>`
- `KeyedEqualityComparer<T, TKey>`: Removed the constructor without the key comparer parameter and applied the default value to the key comparer parameter in the remaining constructor
- `OmnifactotumDateTimeExtensions`: Added the `valueExpression` parameter to the `EnsureKind()`, `EnsureUtc()`, and `EnsureLocal()` methods
- For .NET 5+ and higher, the `valueExpression` parameter is marked with `CallerArgumentExpression`
- For older .NET versions, the `valueExpression` parameter is supplied only for binary compatibility between the different target frameworks
- `OmnifactotumEnumExtensions`: Made methods generic and enforced the `Enum` constraint on:
- `GetName()`
- `GetQualifiedName()`
- `GetFullName()`
- `IsDefined()`
- `EnsureDefined()`
- `CreateEnumValueNotImplementedException()`
- `CreateEnumValueNotSupportedException()`
- `OmnifactotumEnumExtensions`: Added the `enumerationValueExpression` parameter to the `EnsureDefined<TEnum>()` method
- For .NET 5+ and higher, the `enumerationValueExpression` parameter is marked with `CallerArgumentExpression`
- For older .NET versions, the `enumerationValueExpression` parameter is supplied only for binary compatibility between the different target frameworks
- `OmnifactotumGenericObjectExtensions`: Removed the `ToPropertyString<T>()` methods
- `OmnifactotumGenericObjectExtensions`: Added the `valueExpression` parameter to the `EnsureNotNull<T>()` methods
- For .NET 5+ and higher, the `valueExpression` parameter is marked with `CallerArgumentExpression`
- For older .NET versions, the `valueExpression` parameter is supplied only for binary compatibility between the different target frameworks
- `OmnifactotumUriExtensions`: Added the `valueExpression` parameter to the `EnsureAbsoluteUri()` and `EnsureWebUri()` methods
- For .NET 5+ and higher, the `valueExpression` parameter is marked with `CallerArgumentExpression`
- For older .NET versions, the `valueExpression` parameter is supplied only for binary compatibility between the different target frameworks
- `RecursiveProcessingContext<T>` class: Removed the parameterless constructor and applied the default value for the parameter in the parameterized constructor
- `SyncValueContainer<T>`: Removed parameterless constructor
- **Validation** types: Marked Validation attributes non-CLS compliant (as per compiler warnings)
- `BaseValidatableMemberAttribute`
- `ValidatableMemberAttribute`
- `BaseMemberConstraintAttribute`
- `MemberConstraintAttribute`
- `MemberItemConstraintAttribute`
- `ValueContainer<T>`: Removed parameterless constructor
-`VirtualTreeNode.Create<T>` method: Added optional parameter `IReadOnlyCollection<VirtualTreeNode<T>>? children`
- `VirtualTreeNode<T>`: Replaced all constructors with single `VirtualTreeNode(T value, IReadOnlyCollection<VirtualTreeNode<T>>? children = null)`
- `VirtualTreeNodeBase<T>`: Redesigned constructors and made the remaining constructor non visible outside assembly (`private protected`)
- `VirtualTreeNodeRoot<T>`: Replaced all constructors with single `VirtualTreeNodeRoot(IReadOnlyCollection<VirtualTreeNode<T>>? children = null)`
- `WeakReferenceBasedCache<TKey, TValue>`
- Applied the `notnull` constraint on the `TKey` type parameter
- Removed the constructor overload without the `IEqualityComparer<TKey>? keyEqualityComparer` parameter and applied the corresponding default value in the remaining constructor
#### New features
- Added support of **.NET 6**
- Enabled **Nullable Reference Types** for all the types across the entire project (except `Omnifactotum.Annotations.*`)
- `ComparableObjectBase`: Implemented `IComparable`
- `OmnifactotumCollectionExtensions`: Added the `Chunk<TSource>(this IEnumerable<TSource> source, int size)` extension method to use with .NET versions prior to 6.0
- Added `OmnifactotumNullableEnumExtensions`:
- `CreateEnumValueNotImplementedException<TEnum>()`
- `CreateEnumValueNotSupportedException<TEnum>()`
- `OmnifactotumStringExtensions`:
- Added the `TrimPostfix()` method
- Added the `TrimPrefix()` method
- Added `VirtualTreeNodeRoot` static helper class
- **Validation**:
- Added `EnumValueDefinedConstraint<TEnum>` constraint
- Added `NullableEnumValueDefinedConstraint<TEnum>` constraint
#### Minor updates and fixes
- Applied `AggressiveInlining` (or `AggressiveInlining` and `AggressiveOptimization`), where appropriate, in:
- `ComparableObjectBase`
- `DirectedGraphNode`
- `EquatableObjectBase`
- `KeyedEqualityComparer`
- `OmnifactotumDateTimeExtensions`
- `OmnifactotumDisposableExtensions`
- `OmnifactotumEnumExtensions`
- `OmnifactotumHashCodeHelper`
- `OmnifactotumMathExtensions`
- `OmnifactotumMethodBaseExtensions`
- `OmnifactotumNullableBooleanExtensions`
- `OmnifactotumOperationContextExtensions`
- `OmnifactotumSetExtensions`
- `OmnifactotumTypeExtensions`
- `OmnifactotumUriExtensions`
- `ValueRange`
- `ValueRange<T>`
- Improved annotations in:
- `ComparableValueCapsule<T>`
- `EnumFactotum`
- `EquatableValueCapsule<T>`
- `Factotum`
- `OmnifactotumArrayExtensions`
- `OmnifactotumDictionaryExtensions`
- `OmnifactotumEnumExtensions`
- `OmnifactotumExpressionExtensions`
- `OmnifactotumHashCodeHelper`
- `OmnifactotumMathExtensions`
- `OmnifactotumMethodBaseExtensions`
- `OmnifactotumNullableBooleanExtensions`
- `OmnifactotumOperationContextExtensions`
- `OmnifactotumTypeExtensions`
- `ReadOnlySet<T>`
- `ValueRange`
- `ValueRange<T>`
- Minor optimizations in
- `Factotum.SetDefaultValues<T>()`
- `OmnifactotumAssemblyExtensions.GetLocalPath()`
---
### Changes in 0.8.0 (since 0.7.0)
#### New features
- Added `TemplatedStringResolver` (a templated string is defined in a way similar to C# interpolated string)
---
### Changes in 0.7.0 (since 0.6.0)
#### Breaking Changes
- **Removed** support of **.NET Framework 4.0**
- `OmnifactotumGenericObjectExtensions`: Removed the `Morph()` methods (null propagation can be used instead)
- Removed the `AsyncFactotum` class in favor of `async`/`await`
- The `OmnifactotumCollectionExtensions.DoForEachAsync()` overloads now accept `CancellationToken` and pass it to `actionAsync`
#### Deprecations
- `Factotum.CreateEmptyCompletedTask()` (use `Task.CompletedTask`)
- `Factotum.CreateEmptyFaultedTask()` (use `Task.FromException(Exception)`)
#### New features
- Extension Methods
- `OmnifactotumNullableTimeSpanExtensions`:
- Added the `ToFixedString()` method
- Added the `ToFixedStringWithMilliseconds()` method
- Added the `ToPreciseFixedString()` method
- `OmnifactotumTimeSpanExtensions`:
- Added the `ToFixedString()` method
- Added the `ToFixedStringWithMilliseconds()` method
- Added the `ToPreciseFixedString()` method
- `OmnifactotumUriExtensions`:
- Added the `EnsureAbsoluteUri()` method
- Added the `EnsureWebUri()` method
- Internally added `System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute` and `System.Diagnostics.CodeAnalysis.NotNullWhenAttribute` to make these attributes available when targeting older frameworks (prior to .NET Standard 2.1 and .NET 5.0). Affected methods:
- `OmnifactotumGenericObjectExtensions`
- `EnsureNotNull<T>()`
- `OmnifactotumSecureStringExtensions`
- `IsNullOrEmpty()`
- `ToPlainText()`
- `OmnifactotumStringExtensions`
- `IsNullOrEmpty()`
- `IsNullOrWhiteSpace()`
- `IsWebUri`
- `ToSecureString()`
- `OmnifactotumUriExtensions`
- `EnsureAbsoluteUri()`
- `EnsureWebUri()`
- `IsWebUri`
#### Minor updates and fixes
- `OmnifactotumGenericObjectExtensions`:
- Fixed nullability annotations on the `ToPropertyString()` methods
- Fixed documentation on the `EnsureNotNull()` method
- `OmnifactotumSecureStringExtensions`: Fixed `ContractAnnotation` on the `IsNullOrEmpty()` method
- `OmnifactotumStringExtensions`: Fixed `ContractAnnotation` on the `IsNullOrEmpty()` and `IsNullOrWhiteSpace()` methods
- Applied missing `InstantHandle` annotation on `ObjectValidationResult.GetException(...)`
- Improvements in `OmnifactotumDictionaryExtensions`:
- Using Nullable Reference Types (where applicable)
- Applied `AggressiveInlining` (where applicable)
---
### Changes in 0.6.0 (since 0.5.0)
#### Breaking Changes
- `OmnifactotumArrayExtensions`
- `Initialize<T>()` overloads now return the passed array instead of `void`
- Enforced the `Enum` constraint on the applicable generic types and methods
- `EnumFactotum` methods:
- `GetValue<TEnum>()`
- `GetValue<TEnum>()`
- `GetAllValues<TEnum>()`
- `GetAllFlagValues<TEnum>()`
- `EnumFixedSizeDictionary<TKey, TValue>` class
- `EnumFixedSizeDictionaryDeterminant<TKey>` class
- `OmnifactotumEnumExtensions` methods:
- `IsAllSet<TEnum>()`
- `IsAnySet<TEnum>()`
- `IsOneOf<TEnum>()`
#### Deprecations
- Object validation
- Deprecated `NotNullOrWhiteSpaceStringConstraint` in favor of the newly
added `NotBlankStringConstraint`
#### New features
- Types
- Added delegate `Task EventHandlerAsync<>(...)` (excluding .NET Framework 4.0)
- Added `OutFunc<...>` delegates (similar to `System.Func<>`, but having an `out` parameter of the type `TOutput`)
- `OutFunc<TOutput, out TResult>`
- `OutFunc<in T, TOutput, out TResult>`
- `OutFunc<in T1, in T2, TOutput, out TResult>`
- `OutFunc<in T1, in T2, in T3, TOutput, out TResult>`
- Added `SemaphoreSlimBasedLock`
- Object validation:
- Added `NotBlankStringConstraint`
- Added `NotNullOrEmptyCollectionConstraint`
- Added `NotNullOrEmptyCollectionConstraint<T>`
- Added `WebUrlConstraint`
- Extension Methods
- Added `EventHandlerAsyncExtensions` (extension methods for `EventHandlerAsync<>`) (excluding .NET Framework 4.0)
- `OmnifactotumArrayExtensions`
- Using Nullable Reference Types (where applicable)
- Added `Initialize<T>(T[], T)` (initializing with a specific constant value)
- Updated `OmnifactotumCollectionExtensions`
- Added `DoForEachAsync`
- Using Nullable Reference Types for all the methods (where applicable). Particularly:
- `GetFastCount`
- `CollectionsEquivalent`
- `CollectionsEqual`
- `FindDuplicates`
- `DisposeCollectionItemsSafely`
- `AvoidNull`
- `ToHashSet`
- `ToUIString`
- Updated `OmnifactotumDateTimeExtensions`
- Added `EnsureKind()`, `EnsureUtc()`, and `EnsureLocal()` methods
- Added `ToFixedStringWithMilliseconds()` method
- Exposed `FixedStringFormat`, `FixedStringWithMillisecondsFormat`, and `PreciseFixedStringFormat` fields
- Updated `OmnifactotumDateTimeOffsetExtensions`
- Added `ToFixedStringWithMilliseconds()` method
- Exposed `FixedStringFormat`, `FixedStringWithMillisecondsFormat`, and `PreciseFixedStringFormat` fields
- Added `OmnifactotumDelegateExtensions` (extension methods for delegates) with method:
- `GetTypedInvocations()`
- Added `OmnifactotumEqualityComparerExtensions` (extension methods for `IEqualityComparer<T>`) with method:
- `GetHashCodeSafely(this IEqualityComparer<T>, ...)`
- Updated `OmnifactotumGenericObjectExtensions`:
- Added `GetObjectReferenceDescription()`
- Added `GetShortObjectReferenceDescription()`
- Added `AsNullable<T>` (`where T : struct`)
- Applied `NotNullIfNotNull` annotation on `EnsureNotNull()` (.NET Standard 2.1+ and .NET 5.0+ only)
- Using Nullable Reference Types (where applicable). Particularly:
- `ToStringSafely()`
- `ToStringSafelyInvariant()`
- `GetHashCodeSafely()`
- `GetTypeSafely()`
- `ToUIString()`
- `ToPropertyString()`
- `IsEqualByContentsTo()`
- `Morph()`
- Added `OmnifactotumHttpStatusCodeExtensions` with method:
- `ToUIString(HttpStatusCode)`
- Added `OmnifactotumNullableDateTimeExtensions` with methods:
- `ToFixedString()`
- `ToFixedStringWithMilliseconds()`
- `ToPreciseFixedString()`
- Added `OmnifactotumNullableDateTimeOffsetExtensions` with methods:
- `ToFixedString()`
- `ToFixedStringWithMilliseconds()`
- `ToPreciseFixedString()`
- Added `OmnifactotumTaskExtensions` with methods (excluding .NET Framework 4.0):
- `AwaitAllAsync(IEnumerable<Task>)`
- `AwaitAllAsync(IEnumerable<Task<TResult>>)`
- `ConfigureAwaitNoCapturedContext(Task)`
- `ConfigureAwaitNoCapturedContext(Task<TResult>)`
- Added `OmnifactotumValueTaskExtensions` with methods (excluding .NET Framework 4.0):
- `ConfigureAwaitNoCapturedContext(ValueTask)`
- `ConfigureAwaitNoCapturedContext(ValueTask<TResult>)`
#### Minor Updates
- `OmnifactotumArrayExtensions`: Minor optimization in `AvoidNull()`
- `OmnifactotumGenericObjectExtensions`
- `ToStringSafely()` and `ToStringSafelyInvariant()` now never return `null` and instead fall back to `string.Empty`
- `OmnifactotumStringExtensions`: Fixed annotation in `ToUIString()`
- Applied `MethodImplOptions.AggressiveInlining` (and, when possible, `MethodImplOptions.AggressiveOptimization`) to the methods, where reasonable. Affected classes:
- `OmnifactotumGenericObjectExtensions`
- `OmnifactotumCollectionExtensions`
---
### Changes in 0.5.0 (since 0.4.1)
#### Breaking Changes
- `ReadOnlySet` class:
- `IsReadOnly` property now implements `ICollection<T>.IsReadOnly` **explicitly**
- `IValueContainer<T>` moved from the namespace `Omnifactotum` to `Omnifactotum.Abstractions`
#### New features
- Added `ICurrentDateTimeProvider`, `CurrentDateTimeProviderExtensions`, and `LocalComputerCurrentDateTimeProvider`
- Added `IElapsedTimeProvider`, `ElapsedTimeProviderExtensions`, and `StopwatchElapsedTimeProvider`
- The `ReadOnlySet` class now implements `IReadOnlySet` (.NET 5+)
- Added new extension methods for `System.String`:
- `IsWebUri(string)`
- `ToSecureString(string)`
- `WithoutTrailingSlash(string)`
- `WithSingleTrailingSlash(string)`
- Added new extension methods for `System.Uri`:
- `IsWebUri(Uri)`
- `ToUIString(Uri)`
- `WithoutTrailingSlash(Uri)`
- `WithSingleTrailingSlash(Uri)`
- Added new extension methods for `System.Security.SecureString`:
- `IsNullOrEmpty(SecureString)`
- `ToPlainText(SecureString)`
- Added `ContractAnnotation` to `OmnifactotumGenericObjectExtensions.EnsureNotNull`
- Improvements in the `OmnifactotumStringExtensions` class:
- Using Nullable Reference Types (where applicable)
- Added the `ContractAnnotation` annotations (where applicable)
- Added the `AggressiveInlining` flag (where applicable)
- Improved parameter annotations (using `NotNullWhen`, `ItemCanBeNull` etc. where applicable)
- Other minor improvements
#### Minor Updates
- Polished the XML documentation
- Minor optimizations in the `Factotum` class:
- Applied `MethodImplOptions.AggressiveInlining` where applicable
- Forwarding `CreateEmptyCompletedTask()` to `Task.CompletedTask` (except for NET 4.0)
- Forwarding `CreateEmptyFaultedTask(Exception)` to `Task.FromException(Exception)` (except for NET 4.0)
---
### Changes in 0.4.1 (since 0.4.0)
- Added the `Factotum.For<TObject>.Identity` method (same as `Factotum.Identity<T>`)
- Added `Factotum.For<TObject>.IdentityMethod` (the cached reference to the `Factotum.For<TObject>.Identity` method)
- Using the `Deterministic` build option
- Using Portable PDBs
- Using `snupkg` format of the symbol package
---
### Changes in 0.4.0 (since 0.3.0.119)
#### Major Updates
- `Omnifactotum` is now the multi-target package for:
- .NET Framework 4.0, 4.6.1, and 4.7.2
- .NET Standard 2.0 and 2.1
- .NET 5.0
- Addressed multi-target compatibility issues in:
- `ColoredConsoleTraceListener`
- `OmnifactotumAssemblyExtensions`
- `OmnifactotumCollectionExtensions`
- `OmnifactotumDictionaryExtensions`
- `OmnifactotumOperationContextExtensions`
- `KeyValuePair` (static helper)
- Omnifactotum's `ReadOnlyDictionary<TKey, TValue>`
- `WinEventLog`
- Added `OmnifactotumKeyValuePair` static helper for facilitating migration from .NET Framework to .NET Standard/Core
#### Breaking Changes
- `Factotum`: Removed the methods `ToPropertyString` and `AreEqualByContents` in favor of methods `ToPropertyString` and `IsEqualByContentsTo` in `OmnifactotumGenericObjectExtensions`
- `OmnifactotumArrayExtensions`: The method `AsReadOnly()` moved to `OmnifactotumCollectionExtensions`
- `OmnifactotumCustomAttributeProviderExtensions`: Removed the obsolete method `GetCustomAttributes`
- `OmnifactotumGenericObjectExtensions`: Removed the methods `Affirm` and `ComputePredicate`
- `OmnifactotumMathExtensions`: Removed the methods `Sqr(decimal)`, `SqrChecked(float)`, `SqrChecked(double)` since their expected behavior cannot be achieved
#### New features
- `OmnifactotumCollectionExtensions`: Added `ToUIString` implementation for collections of strings and collections of nullable value type instances
- `OmnifactotumGenericObjectExtensions`: Implemented `Morph()` overloads for nullable value types (to complement already existing method for the reference types)
- `OmnifactotumNullableBooleanExtensions`: Added an overload of `ToString` accepting value provider delegates
- Added `ReadOnlyItemCollection<T>` (read-only wrapper for `ICollection<T>`)
- Added partial support of Nullable Reference Types:
- `OmnifactotumGenericObjectExtensions.EnsureNotNull`
- Exposed the class `OmnifactotumRepresentationConstants` (formerly `OmnifactotumConstants`)
- Applied `PureAttribute`, `InstantHandleAttribute`, and `NoEnumerationAttribute` annotations in certain appropriate cases
#### Fixes and improvements
- Improved documentation
- `KeyedEqualityComparer<T, TKey>`: `IEqualityComparer.Equals` and `IEqualityComparer.GetHashCode` now don't throw an exception f an argument is not compatible with the type `T`
- `OmnifactotumAssemblyExtensions`
- `OmnifactotumCollectionHashCodeHelper` (as per the fix in `OmnifactotumHashCodeHelper`)
- `OmnifactotumDateTimeOffsetExtensions`
- `OmnifactotumEnumExtensions`: `GetName`, `GetQualifiedName`, `GetFullName`, `EnsureDefined`, and `IsDefined`
- `OmnifactotumGenericObjectExtensions`:
- `ToUIString()` now uses the invariant culture if the value is `IFormattable`
- Fix in `IsEqualByContentsTo()` for the case of a type with no fields
- `OmnifactotumHashCodeHelper`: Fix in CombineHashCodeValues (for case when the next hash code is zero)
- `OmnifactotumMethodBaseExtensions`
- `OmnifactotumTypeExtensions`
- Updated JetBrains Annotations in `Omnifactotum.Annotations`
---
### Changes in 0.3.0.119 (since 0.3.0.117)
- Omnifactotum: Removed NuGet dependency to the `MSBuildTasks` package since it is only used for development
---
### Changes in 0.3.0.117 (since 0.3.0.114)
- Omnifactotum: `Factotum` and `Factotum.For<TObject>`: Improved annotations
---
### Changes in 0.3.0.114 (since 0.3.0.101)
- `OmnifactotumAssemblyExtensions`: Improvements
- **BREAKING CHANGE**: `OmnifactotumDisposableExtensions`: `DisposeSafely` now works only for reference and nullable types (2 overloads)
- **BREAKING CHANGE**: `OmnifactotumCollectionExtensions`: `DisposeCollectionItemsSafely` now works only for reference and nullable types (2 overloads)
- **BREAKING CHANGE**: `Factotum`: `DisposeAndNull` now works also for nullable types (besides reference types)
- Introduced the `AsyncFactotum` class with the overloaded methods `ComputeAsync` and `ExecuteAsync`
- Fix in `MemberConstraintBase.CastTo<T>` (and hence in `TypedMemberConstraintBase`) for nullable types
- Improved annotations in Object Validator and related classes
- Minor improvements
---
### Changes in 0.3.0.101 (since 0.3.0.90)
- `KeyedEqualityComparer<T, TKey>`: Fixes and improvements
- `KeyedEqualityComparer` static helper class has been introduced
- `Factotum`: `CreateEmptyCompletedTask` and `CreateEmptyFaultedTask` methods have been introduced
- `OmnifactotumGenericObjectExtensions`: `EnsureNotNull` (for nullable) has been introduced
- `IValueContainer<T>` has been introduced for `ValueContainer<T>` and `SyncValueContainer<T>`
- `ValueContainer` and `SyncValueContainer` helper static classes have been introduced
- Improvements and fixes in `OmnifactotumMethodBaseExtensions` and `OmnifactotumTypeExtensions`
- `OmnifactotumStringExtensions`: `TrimSafely`, `TrimStartSafely`, `TrimEndSafely` and `Shorten` methods now never return null
---
### Changes in 0.3.0.90 (since 0.3.0.86)
- **BREAKING CHANGE** `OmnifactotumCustomAttributeProviderExtensions`: `GetCustomAttributes` has been renamed to `GetCustomAttributeArray` (for compatibility with FW 4.5+)
---
### Changes in 0.3.0.86 (since 0.3.0.83)
- **BREAKING CHANGE** `OmnifactotumDictionaryExtensions`: The method `GetValueOrCreate` has been renamed to `GetOrCreateValue` for readability and in order to avoid confusion with `GetValueOrDefault`
- `OmnifactotumDictionaryExtensions`: Improved annotations
- `ValueContainer` and `SyncValueContainer`:
- Support for equality comparison
- Added `DebuggerDisplay` attribute and `ToString()` method
- `OmnifactotumMathExtensions` class has been introduced:
- `Sqr` (square)
- `Sqrt` (square root)
- `Abs` (absolute value)
---
### Changes in 0.3.0.83 (since 0.3.0.82)
- `FixedSizeDictionary`: Improved annotations
- `FixedSizeDictionary`: Implemented version verification in the enumerator
---
### Changes in 0.3.0.82 (since 0.3.0.80)
- `FixedSizeDictionary`: Removed index verification in the internal determinant since this verification highly affected performance
---
### Changes in 0.3.0.80 (since 0.3.0.79)
- `EnumFixedSizeDictionary`: Fix in determining the size
---
### Changes in 0.3.0.79 (since 0.3.0.74)
- `FixedSizeDictionary` and `EnumFixedSizeDictionary` have been introduced.
- Applied Omnifactotum Annotations to the `Factotum` and `OmnifactotumGenericObjectExtensions` classes.
---
### Changes in 0.3.0.74 (since 0.2.0.59)
- **BREAKING CHANGE** Object Validation: Redesign and support of `IEnumerable`.
- **BREAKING CHANGE** Renamed `EnumHelper` to `EnumFactotum`.
- **BREAKING CHANGE** `OmnifactotumExpressionExtensions` is now in the namespace `System.Linq.Expressions` (instead of System).