From 647044dd9a5cb0042328a49211395c5f05086172 Mon Sep 17 00:00:00 2001 From: Joshua Masek Date: Fri, 24 Nov 2023 15:16:39 -0500 Subject: [PATCH 1/2] add multi targetting for .net standard 2.0 and .net 6 - .net standard 2.0 supports newer .net framework versions - some Pollyfill functionality needed for .net framework --- src/Demo.CS/NGenericDimensions.Demo.CS.csproj | 2 +- src/Demo.VB/NGenericDimensions.Demo.VB.vbproj | 2 +- src/NGenericDimensions/Area.cs | 6 +++++ src/NGenericDimensions/Duration.cs | 6 +++++ src/NGenericDimensions/Helpers/Polyfill.cs | 22 +++++++++++++++++++ src/NGenericDimensions/Length.cs | 8 ++++++- src/NGenericDimensions/Mass.cs | 6 +++++ .../NGenericDimensions.csproj | 9 ++++++-- src/NGenericDimensions/Speed.cs | 6 +++++ src/NGenericDimensions/UnitOfMeasure.cs | 6 +++-- src/NGenericDimensions/Volume.cs | 6 +++++ .../NGenericDimensionsUnitTests.csproj | 12 +++++----- src/UnitTests/TestsHelperBBase.cs | 7 +++++- 13 files changed, 84 insertions(+), 14 deletions(-) create mode 100644 src/NGenericDimensions/Helpers/Polyfill.cs diff --git a/src/Demo.CS/NGenericDimensions.Demo.CS.csproj b/src/Demo.CS/NGenericDimensions.Demo.CS.csproj index 8e678d9..86a1518 100644 --- a/src/Demo.CS/NGenericDimensions.Demo.CS.csproj +++ b/src/Demo.CS/NGenericDimensions.Demo.CS.csproj @@ -2,7 +2,7 @@ Exe - net6 + net48;net6.0 diff --git a/src/Demo.VB/NGenericDimensions.Demo.VB.vbproj b/src/Demo.VB/NGenericDimensions.Demo.VB.vbproj index a9d5b57..6a12aad 100644 --- a/src/Demo.VB/NGenericDimensions.Demo.VB.vbproj +++ b/src/Demo.VB/NGenericDimensions.Demo.VB.vbproj @@ -3,7 +3,7 @@ Exe NGenericDimensions.Demo.VB - net6 + net48;net6.0 diff --git a/src/NGenericDimensions/Area.cs b/src/NGenericDimensions/Area.cs index 50dce3a..debd159 100644 --- a/src/NGenericDimensions/Area.cs +++ b/src/NGenericDimensions/Area.cs @@ -222,6 +222,12 @@ object IConvertible.ToType(Type conversionType, IFormatProvider? provider) ushort IConvertible.ToUInt16(IFormatProvider? provider) => GenericOperatorMath.ConvertToUInt16(AreaValue); uint IConvertible.ToUInt32(IFormatProvider? provider) => GenericOperatorMath.ConvertToUInt32(AreaValue); ulong IConvertible.ToUInt64(IFormatProvider? provider) => GenericOperatorMath.ConvertToUInt64(AreaValue); +#if !NET + bool IConvertible.ToBoolean(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a Boolean is not supported."); + char IConvertible.ToChar(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a Char is not supported."); + DateTime IConvertible.ToDateTime(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a DateTime is not supported."); + string IConvertible.ToString(IFormatProvider? provider) => ToString(null, provider); +#endif #endregion } } diff --git a/src/NGenericDimensions/Duration.cs b/src/NGenericDimensions/Duration.cs index 7224f0c..ecc340a 100644 --- a/src/NGenericDimensions/Duration.cs +++ b/src/NGenericDimensions/Duration.cs @@ -225,6 +225,12 @@ object IConvertible.ToType(Type conversionType, IFormatProvider? provider) ushort IConvertible.ToUInt16(IFormatProvider? provider) => GenericOperatorMath.ConvertToUInt16(DurationValue); uint IConvertible.ToUInt32(IFormatProvider? provider) => GenericOperatorMath.ConvertToUInt32(DurationValue); ulong IConvertible.ToUInt64(IFormatProvider? provider) => GenericOperatorMath.ConvertToUInt64(DurationValue); +#if !NET + bool IConvertible.ToBoolean(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a Boolean is not supported."); + char IConvertible.ToChar(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a Char is not supported."); + DateTime IConvertible.ToDateTime(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a DateTime is not supported."); + string IConvertible.ToString(IFormatProvider? provider) => ToString(null, provider); +#endif #endregion } } diff --git a/src/NGenericDimensions/Helpers/Polyfill.cs b/src/NGenericDimensions/Helpers/Polyfill.cs new file mode 100644 index 0000000..03055ad --- /dev/null +++ b/src/NGenericDimensions/Helpers/Polyfill.cs @@ -0,0 +1,22 @@ +#if !NET +using System; + +namespace NGenericDimensions +{ + internal static class Polyfill + { + internal static bool Contains(this string source, string value, StringComparison comparisonType) => source.IndexOf(value, comparisonType) >= 0; + + internal static string Replace(this string source, string oldValue, string? newValue, StringComparison comparisonType) + { + if (comparisonType == StringComparison.Ordinal) + { + return source.Replace(oldValue, newValue); + } + + // not implemented since nothing seems to need this yet + throw new NotImplementedException(); + } + } +} +#endif diff --git a/src/NGenericDimensions/Length.cs b/src/NGenericDimensions/Length.cs index fcf0355..bf3e3ce 100644 --- a/src/NGenericDimensions/Length.cs +++ b/src/NGenericDimensions/Length.cs @@ -276,7 +276,13 @@ object IConvertible.ToType(Type conversionType, IFormatProvider? provider) ushort IConvertible.ToUInt16(IFormatProvider? provider) => GenericOperatorMath.ConvertToUInt16(LengthValue); uint IConvertible.ToUInt32(IFormatProvider? provider) => GenericOperatorMath.ConvertToUInt32(LengthValue); ulong IConvertible.ToUInt64(IFormatProvider? provider) => GenericOperatorMath.ConvertToUInt64(LengthValue); - #endregion +#if !NET + bool IConvertible.ToBoolean(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a Boolean is not supported."); + char IConvertible.ToChar(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a Char is not supported."); + DateTime IConvertible.ToDateTime(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a DateTime is not supported."); + string IConvertible.ToString(IFormatProvider? provider) => ToString(null, provider); +#endif +#endregion } } diff --git a/src/NGenericDimensions/Mass.cs b/src/NGenericDimensions/Mass.cs index 52aa292..36540a8 100644 --- a/src/NGenericDimensions/Mass.cs +++ b/src/NGenericDimensions/Mass.cs @@ -202,6 +202,12 @@ object IConvertible.ToType(Type conversionType, IFormatProvider? provider) ushort IConvertible.ToUInt16(IFormatProvider? provider) => GenericOperatorMath.ConvertToUInt16(MassValue); uint IConvertible.ToUInt32(IFormatProvider? provider) => GenericOperatorMath.ConvertToUInt32(MassValue); ulong IConvertible.ToUInt64(IFormatProvider? provider) => GenericOperatorMath.ConvertToUInt64(MassValue); +#if !NET + bool IConvertible.ToBoolean(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a Boolean is not supported."); + char IConvertible.ToChar(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a Char is not supported."); + DateTime IConvertible.ToDateTime(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a DateTime is not supported."); + string IConvertible.ToString(IFormatProvider? provider) => ToString(null, provider); +#endif #endregion } } diff --git a/src/NGenericDimensions/NGenericDimensions.csproj b/src/NGenericDimensions/NGenericDimensions.csproj index 2290343..cf97499 100644 --- a/src/NGenericDimensions/NGenericDimensions.csproj +++ b/src/NGenericDimensions/NGenericDimensions.csproj @@ -1,11 +1,16 @@ - + - net6 + netstandard2.0;net6.0 enable + + 8.0 + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/NGenericDimensions/Speed.cs b/src/NGenericDimensions/Speed.cs index dd41763..5d50784 100644 --- a/src/NGenericDimensions/Speed.cs +++ b/src/NGenericDimensions/Speed.cs @@ -259,6 +259,12 @@ object IConvertible.ToType(Type conversionType, IFormatProvider? provider) ushort IConvertible.ToUInt16(IFormatProvider? provider) => GenericOperatorMath.ConvertToUInt16(SpeedValue); uint IConvertible.ToUInt32(IFormatProvider? provider) => GenericOperatorMath.ConvertToUInt32(SpeedValue); ulong IConvertible.ToUInt64(IFormatProvider? provider) => GenericOperatorMath.ConvertToUInt64(SpeedValue); +#if !NET + bool IConvertible.ToBoolean(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a Boolean is not supported."); + char IConvertible.ToChar(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a Char is not supported."); + DateTime IConvertible.ToDateTime(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a DateTime is not supported."); + string IConvertible.ToString(IFormatProvider? provider) => ToString(null, provider); +#endif #endregion } } diff --git a/src/NGenericDimensions/UnitOfMeasure.cs b/src/NGenericDimensions/UnitOfMeasure.cs index 0f4821d..1c58d0c 100644 --- a/src/NGenericDimensions/UnitOfMeasure.cs +++ b/src/NGenericDimensions/UnitOfMeasure.cs @@ -13,13 +13,15 @@ public interface IDimension : IFormattable, IConvertible { double Value { get; } +#if NET bool IConvertible.ToBoolean(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a Boolean is not supported."); char IConvertible.ToChar(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a Char is not supported."); DateTime IConvertible.ToDateTime(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a DateTime is not supported."); string IConvertible.ToString(IFormatProvider? provider) => ToString(null, provider); +#endif } - [EditorBrowsable(EditorBrowsableState.Never)] + [EditorBrowsable(EditorBrowsableState.Never)] [SuppressMessage("Design", "CA1040:Avoid empty interfaces", Justification = "Empty interfaces are sometimes the only way to control a generic constraint.")] public interface IDimensionSupportsPerExtension { } @@ -137,7 +139,7 @@ internal protected virtual string ToSingularString() // use some default logic to try to figure out the singular form of the unit if (name.EndsWith("s", StringComparison.Ordinal)) { - return name[0..^1]; + return name.Substring(0, name.Length - 1); } // otherwise just return the name - if this name is plural, then the inheriting class should override this function diff --git a/src/NGenericDimensions/Volume.cs b/src/NGenericDimensions/Volume.cs index 7fd5af7..820bbd1 100644 --- a/src/NGenericDimensions/Volume.cs +++ b/src/NGenericDimensions/Volume.cs @@ -222,6 +222,12 @@ object IConvertible.ToType(Type conversionType, IFormatProvider? provider) ushort IConvertible.ToUInt16(IFormatProvider? provider) => GenericOperatorMath.ConvertToUInt16(VolumeValue); uint IConvertible.ToUInt32(IFormatProvider? provider) => GenericOperatorMath.ConvertToUInt32(VolumeValue); ulong IConvertible.ToUInt64(IFormatProvider? provider) => GenericOperatorMath.ConvertToUInt64(VolumeValue); +#if !NET + bool IConvertible.ToBoolean(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a Boolean is not supported."); + char IConvertible.ToChar(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a Char is not supported."); + DateTime IConvertible.ToDateTime(IFormatProvider? provider) => throw new InvalidCastException("The conversion to a DateTime is not supported."); + string IConvertible.ToString(IFormatProvider? provider) => ToString(null, provider); +#endif #endregion } } diff --git a/src/UnitTests/NGenericDimensionsUnitTests.csproj b/src/UnitTests/NGenericDimensionsUnitTests.csproj index 2a20915..3da13eb 100644 --- a/src/UnitTests/NGenericDimensionsUnitTests.csproj +++ b/src/UnitTests/NGenericDimensionsUnitTests.csproj @@ -1,20 +1,20 @@ - net6 + net48;net6.0 false - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/UnitTests/TestsHelperBBase.cs b/src/UnitTests/TestsHelperBBase.cs index 61f3c98..0c6ac6d 100644 --- a/src/UnitTests/TestsHelperBBase.cs +++ b/src/UnitTests/TestsHelperBBase.cs @@ -11,7 +11,9 @@ public class TestsHelperBBase { protected readonly static string[] ValidDataTypeConversions = { - @"System.Char>(System.Convert.ToChar(4)", // this works in .net6 but not in an earlier one i think +#if NET + @"System.Char>(System.Convert.ToChar(4)", +#endif @"System.Double>(System.Convert.ToDouble(4.44444)", @"System.Double>(System.Convert.ToSingle(4.44444)", @"System.Single>(System.Convert.ToSingle(4.44444)", @@ -32,6 +34,9 @@ public class TestsHelperBBase protected readonly static string[] InvalidDataTypeConversions = { +#if !NET + @"System.Char>(System.Convert.ToChar(4)", +#endif @"System.Boolean>(System.Convert.ToBoolean(4)" }; From 587f9f28da4025485d7ae5eeb5dc355072a21482 Mon Sep 17 00:00:00 2001 From: Joshua Masek Date: Fri, 24 Nov 2023 21:35:21 -0500 Subject: [PATCH 2/2] add more multi targetting of .net versions --- src/Demo.CS/NGenericDimensions.Demo.CS.csproj | 4 ++-- src/Demo.VB/NGenericDimensions.Demo.VB.vbproj | 2 +- src/NGenericDimensions/Helpers/Polyfill.cs | 12 ++++++++++++ src/NGenericDimensions/NGenericDimensions.csproj | 5 +++-- src/UnitTests/NGenericDimensionsUnitTests.csproj | 13 +++++++++---- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/Demo.CS/NGenericDimensions.Demo.CS.csproj b/src/Demo.CS/NGenericDimensions.Demo.CS.csproj index 86a1518..6380a34 100644 --- a/src/Demo.CS/NGenericDimensions.Demo.CS.csproj +++ b/src/Demo.CS/NGenericDimensions.Demo.CS.csproj @@ -1,8 +1,8 @@ - + Exe - net48;net6.0 + net48;net472;net471;net47;net462;net461;net46;net6.0;net7.0;net8.0 diff --git a/src/Demo.VB/NGenericDimensions.Demo.VB.vbproj b/src/Demo.VB/NGenericDimensions.Demo.VB.vbproj index 6a12aad..b9a9d68 100644 --- a/src/Demo.VB/NGenericDimensions.Demo.VB.vbproj +++ b/src/Demo.VB/NGenericDimensions.Demo.VB.vbproj @@ -3,7 +3,7 @@ Exe NGenericDimensions.Demo.VB - net48;net6.0 + net48;net472;net471;net47;net462;net461;net46;net6.0;net7.0;net8.0 diff --git a/src/NGenericDimensions/Helpers/Polyfill.cs b/src/NGenericDimensions/Helpers/Polyfill.cs index 03055ad..7f989dc 100644 --- a/src/NGenericDimensions/Helpers/Polyfill.cs +++ b/src/NGenericDimensions/Helpers/Polyfill.cs @@ -1,5 +1,6 @@ #if !NET using System; +using System.Reflection; namespace NGenericDimensions { @@ -17,6 +18,17 @@ internal static string Replace(this string source, string oldValue, string? newV // not implemented since nothing seems to need this yet throw new NotImplementedException(); } + +#if NET46 + internal static bool IsAssignableFrom(this Type source, Type c) => source.GetTypeInfo().IsAssignableFrom(c.GetTypeInfo()); +#endif + } + +#if NET46 + internal class HashCode + { + internal static int Combine(T1 value1) => value1?.GetHashCode() ?? 0; } +#endif } #endif diff --git a/src/NGenericDimensions/NGenericDimensions.csproj b/src/NGenericDimensions/NGenericDimensions.csproj index cf97499..fcc81ae 100644 --- a/src/NGenericDimensions/NGenericDimensions.csproj +++ b/src/NGenericDimensions/NGenericDimensions.csproj @@ -1,15 +1,16 @@  - netstandard2.0;net6.0 + net46;netstandard2.0;netstandard2.1;net6.0;net7.0;net8.0 enable - + 8.0 + all diff --git a/src/UnitTests/NGenericDimensionsUnitTests.csproj b/src/UnitTests/NGenericDimensionsUnitTests.csproj index 3da13eb..01a71fe 100644 --- a/src/UnitTests/NGenericDimensionsUnitTests.csproj +++ b/src/UnitTests/NGenericDimensionsUnitTests.csproj @@ -1,7 +1,7 @@ - + - net48;net6.0 + net48;net472;net471;net47;net462;net461;net46;net6.0;net7.0;net8.0 false @@ -11,10 +11,15 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + + - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + all runtime; build; native; contentfiles; analyzers; buildtransitive