<PackageReference Include="NUnit" Version="4.2.2" />

ComparisonAdapter

public abstract class ComparisonAdapter
ComparisonAdapter class centralizes all comparisons of values in NUnit, adapting to the use of any provided IComparer, IComparer<T> or Comparison<T>.
using NUnit.Framework.Internal; using System; using System.Collections; using System.Collections.Generic; using System.Runtime.CompilerServices; namespace NUnit.Framework.Constraints { [System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] public abstract class ComparisonAdapter { [System.Runtime.CompilerServices.NullableContext(0)] private class DefaultComparisonAdapter : ComparerAdapter { public DefaultComparisonAdapter() : base(NUnitComparer.Default) { } } [System.Runtime.CompilerServices.Nullable(0)] private class ComparerAdapter : ComparisonAdapter { private readonly IComparer _comparer; public ComparerAdapter(IComparer comparer) { _comparer = comparer; } [System.Runtime.CompilerServices.NullableContext(2)] public override int Compare(object expected, object actual) { return _comparer.Compare(expected, actual); } } [System.Runtime.CompilerServices.Nullable(0)] private class ComparerAdapter<[System.Runtime.CompilerServices.Nullable(2)] T> : ComparisonAdapter { private readonly IComparer<T> _comparer; public ComparerAdapter(IComparer<T> comparer) { _comparer = comparer; } [System.Runtime.CompilerServices.NullableContext(2)] public override int Compare(object expected, object actual) { if (!TypeHelper.TryCast<T>(expected, out T value)) throw new ArgumentException("Cannot compare " + (expected?.ToString() ?? "null")); if (!TypeHelper.TryCast<T>(actual, out T value2)) throw new ArgumentException("Cannot compare to " + (actual?.ToString() ?? "null")); return _comparer.Compare(value, value2); } } [System.Runtime.CompilerServices.Nullable(0)] private class ComparisonAdapterForComparison<[System.Runtime.CompilerServices.Nullable(2)] T> : ComparisonAdapter { private readonly Comparison<T> _comparison; public ComparisonAdapterForComparison(Comparison<T> comparer) { _comparison = comparer; } [System.Runtime.CompilerServices.NullableContext(2)] public override int Compare(object expected, object actual) { if (!TypeHelper.TryCast<T>(expected, out T value)) throw new ArgumentException("Cannot compare " + (expected?.ToString() ?? "null")); if (!TypeHelper.TryCast<T>(actual, out T value2)) throw new ArgumentException("Cannot compare to " + (actual?.ToString() ?? "null")); return _comparison(value, value2); } } public static ComparisonAdapter Default => new DefaultComparisonAdapter(); public static ComparisonAdapter For(IComparer comparer) { return new ComparerAdapter(comparer); } public static ComparisonAdapter For<[System.Runtime.CompilerServices.Nullable(2)] T>(IComparer<T> comparer) { return new ComparerAdapter<T>(comparer); } public static ComparisonAdapter For<[System.Runtime.CompilerServices.Nullable(2)] T>(Comparison<T> comparer) { return new ComparisonAdapterForComparison<T>(comparer); } [System.Runtime.CompilerServices.NullableContext(2)] public abstract int Compare(object expected, object actual); } }