Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/Demo.CS/NGenericDimensions.Demo.CS.csproj
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6</TargetFramework>
<TargetFrameworks>net48;net472;net471;net47;net462;net461;net46;net6.0;net7.0;net8.0</TargetFrameworks>
</PropertyGroup>

<ItemGroup>
Expand Down
2 changes: 1 addition & 1 deletion src/Demo.VB/NGenericDimensions.Demo.VB.vbproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<RootNamespace>NGenericDimensions.Demo.VB</RootNamespace>
<TargetFramework>net6</TargetFramework>
<TargetFrameworks>net48;net472;net471;net47;net462;net461;net46;net6.0;net7.0;net8.0</TargetFrameworks>
</PropertyGroup>

<ItemGroup>
Expand Down
6 changes: 6 additions & 0 deletions src/NGenericDimensions/Area.cs
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,12 @@ object IConvertible.ToType(Type conversionType, IFormatProvider? provider)
ushort IConvertible.ToUInt16(IFormatProvider? provider) => GenericOperatorMath<TDataType>.ConvertToUInt16(AreaValue);
uint IConvertible.ToUInt32(IFormatProvider? provider) => GenericOperatorMath<TDataType>.ConvertToUInt32(AreaValue);
ulong IConvertible.ToUInt64(IFormatProvider? provider) => GenericOperatorMath<TDataType>.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
}
}
Expand Down
6 changes: 6 additions & 0 deletions src/NGenericDimensions/Duration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,12 @@ object IConvertible.ToType(Type conversionType, IFormatProvider? provider)
ushort IConvertible.ToUInt16(IFormatProvider? provider) => GenericOperatorMath<TDataType>.ConvertToUInt16(DurationValue);
uint IConvertible.ToUInt32(IFormatProvider? provider) => GenericOperatorMath<TDataType>.ConvertToUInt32(DurationValue);
ulong IConvertible.ToUInt64(IFormatProvider? provider) => GenericOperatorMath<TDataType>.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
}
}
Expand Down
34 changes: 34 additions & 0 deletions src/NGenericDimensions/Helpers/Polyfill.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#if !NET
using System;
using System.Reflection;

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();
}

#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>(T1 value1) => value1?.GetHashCode() ?? 0;
}
#endif
}
#endif
8 changes: 7 additions & 1 deletion src/NGenericDimensions/Length.cs
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,13 @@ object IConvertible.ToType(Type conversionType, IFormatProvider? provider)
ushort IConvertible.ToUInt16(IFormatProvider? provider) => GenericOperatorMath<TDataType>.ConvertToUInt16(LengthValue);
uint IConvertible.ToUInt32(IFormatProvider? provider) => GenericOperatorMath<TDataType>.ConvertToUInt32(LengthValue);
ulong IConvertible.ToUInt64(IFormatProvider? provider) => GenericOperatorMath<TDataType>.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
}
}

Expand Down
6 changes: 6 additions & 0 deletions src/NGenericDimensions/Mass.cs
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,12 @@ object IConvertible.ToType(Type conversionType, IFormatProvider? provider)
ushort IConvertible.ToUInt16(IFormatProvider? provider) => GenericOperatorMath<TDataType>.ConvertToUInt16(MassValue);
uint IConvertible.ToUInt32(IFormatProvider? provider) => GenericOperatorMath<TDataType>.ConvertToUInt32(MassValue);
ulong IConvertible.ToUInt64(IFormatProvider? provider) => GenericOperatorMath<TDataType>.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
}
}
Expand Down
10 changes: 8 additions & 2 deletions src/NGenericDimensions/NGenericDimensions.csproj
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6</TargetFramework>
<TargetFrameworks>net46;netstandard2.0;netstandard2.1;net6.0;net7.0;net8.0</TargetFrameworks>
<Nullable>enable</Nullable>
</PropertyGroup>

<PropertyGroup Condition="('$(TargetFramework)' == 'netstandard2.0') Or ('$(TargetFramework)' == 'net46')">
<LangVersion>8.0</LangVersion>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="AgileObjects.NetStandardPolyfills" Version="1.6.0" Condition="'$(TargetFramework)' == 'net46'" />
<PackageReference Include="Microsoft.Bcl.HashCode" Version="1.1.1" Condition="'$(TargetFramework)' == 'netstandard2.0'" />
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
Expand Down
6 changes: 6 additions & 0 deletions src/NGenericDimensions/Speed.cs
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,12 @@ object IConvertible.ToType(Type conversionType, IFormatProvider? provider)
ushort IConvertible.ToUInt16(IFormatProvider? provider) => GenericOperatorMath<TDataType>.ConvertToUInt16(SpeedValue);
uint IConvertible.ToUInt32(IFormatProvider? provider) => GenericOperatorMath<TDataType>.ConvertToUInt32(SpeedValue);
ulong IConvertible.ToUInt64(IFormatProvider? provider) => GenericOperatorMath<TDataType>.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
}
}
Expand Down
6 changes: 4 additions & 2 deletions src/NGenericDimensions/UnitOfMeasure.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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 { }

Expand Down Expand Up @@ -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
Expand Down
6 changes: 6 additions & 0 deletions src/NGenericDimensions/Volume.cs
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,12 @@ object IConvertible.ToType(Type conversionType, IFormatProvider? provider)
ushort IConvertible.ToUInt16(IFormatProvider? provider) => GenericOperatorMath<TDataType>.ConvertToUInt16(VolumeValue);
uint IConvertible.ToUInt32(IFormatProvider? provider) => GenericOperatorMath<TDataType>.ConvertToUInt32(VolumeValue);
ulong IConvertible.ToUInt64(IFormatProvider? provider) => GenericOperatorMath<TDataType>.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
}
}
Expand Down
19 changes: 12 additions & 7 deletions src/UnitTests/NGenericDimensionsUnitTests.csproj
Original file line number Diff line number Diff line change
@@ -1,20 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6</TargetFramework>
<TargetFrameworks>net48;net472;net471;net47;net462;net461;net46;net6.0;net7.0;net8.0</TargetFrameworks>

<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="coverlet.collector" Version="1.3.0">
<PackageReference Include="coverlet.collector" Version="6.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="3.6.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.2">
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.8.0" Condition="'$(TargetFramework)' != 'net46'" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="2.10.0" Condition="'$(TargetFramework)' == 'net46'" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="xunit" Version="2.6.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.4" Condition="('$(TargetFramework)' != 'net46') And ('$(TargetFramework)' != 'net461') And ('$(TargetFramework)' != 'net462')">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3" Condition="('$(TargetFramework)' == 'net46') Or ('$(TargetFramework)' == 'net461') Or ('$(TargetFramework)' == 'net462')">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
Expand Down
7 changes: 6 additions & 1 deletion src/UnitTests/TestsHelperBBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)",
Expand All @@ -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)"
};

Expand Down