-
Notifications
You must be signed in to change notification settings - Fork 376
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Problem with ENUMS when UnitAbbreviationsCache.Default.GetDefaultAbbreviation is use. #1301
Comments
Fixes #1301 When calling methods to look up unit abbreviation for a unit enum value, which is cast to Enum either by variable or method parameter, then the actual enum type was lost and it failed to get its enum name. ``` System.ArgumentException: Type provided must be an Enum. at System.Enum.GetEnumInfo(RuntimeType enumType, Boolean getNames) at System.RuntimeType.GetEnumName(Object value) at UnitsNet.UnitAbbreviationsCache.TryGetUnitAbbreviations(Type unitType, Int32 unitValue, IFormatProvider formatProvider, String[]& abbreviations) in C:\dev\unitsnet\UnitsNet\CustomCode\UnitAbbreviationsCache.cs:line 246 ``` ### Changes - Handle edge-case when `Enum` type is passed instead of an actual unit enum type
Hi, what version are you on? I see you are using I believe it boils down to casting to using System;
using Xunit;
namespace UnitsNet.Tests;
public class GasFlowTests
{
public GasFlowTests()
{
UnitAbbreviationsCache.Default.MapUnitToDefaultAbbreviation(GasFlowRateUnit.StandardCubicMetersPerDay, "m³/d");
UnitAbbreviationsCache.Default.MapUnitToDefaultAbbreviation(GasFlowRateUnit.ThousandStandardCubicFeetPerDay, "kft³/d");
}
[Fact]
public void GenericEnum_Ok()
{
Assert.Equal("m³/d", UnitAbbreviationsCache.Default.GetDefaultAbbreviation(GasFlowRateUnit.StandardCubicMetersPerDay));
}
[Fact]
public void CastToEnum_Fails()
{
Assert.Equal("m³/d", UnitAbbreviationsCache.Default.GetDefaultAbbreviation((Enum)GasFlowRateUnit.StandardCubicMetersPerDay));
}
public enum GasFlowRateUnit
{
StandardCubicMetersPerDay = 1,
ThousandStandardCubicFeetPerDay = 2,
}
}
I took a quick look and found that the lookup implementation incorrectly tries to do A fix is on the way in #1302. |
Fixes #1301 When looking up unit abbreviation for a unit enum value that is cast to `Enum`, for example via variable or method parameter, the lookup failed due to using `typeof(TUnitEnum)` in the generic method. `Enum` satisfies the generic constraint, but the generic type no longer describes the original unit enum type. Instead, we must use `unitEnumValue.GetType()`. ``` System.ArgumentException: Type provided must be an Enum. at System.Enum.GetEnumInfo(RuntimeType enumType, Boolean getNames) at System.RuntimeType.GetEnumName(Object value) at UnitsNet.UnitAbbreviationsCache.TryGetUnitAbbreviations(Type unitType, Int32 unitValue, IFormatProvider formatProvider, String[]& abbreviations) in C:\dev\unitsnet\UnitsNet\CustomCode\UnitAbbreviationsCache.cs:line 246 ``` ### Changes - Handle edge-case when `Enum` type is passed instead of an actual unit enum type
Merged and should be out as nuget shortly. |
Hi @angularsen! thanks for your answer I'm using 4.132.0 |
@farenasmz are you able to try the latest v5 nuget and see if that helps? You may have to migrate some usages. https://github.com/angularsen/UnitsNet/wiki/Upgrading-from-4.x-to-5.x |
Hello everyone,
I'm currently working on a project utilizing units.net and have encountered an issue while handling custom units. I've defined a new custom unit called
GasFlowRate
and created two specific measures within it:StandardCubicMetersPerDay
andThousandStandardCubicFeetPerDay
.I've used
UnitAbbreviationsCache.Default.MapUnitToDefaultAbbreviation
to set the default abbreviations for these units, and they seem to be mapped correctly.However, when I attempt to retrieve the abbreviation for these units using
UnitAbbreviationsCache.Default.GetDefaultAbbreviation(unit);
, I encounter the following error:InnerException: null, Message: "No abbreviation is specified for Enum.ThousandStandardCubicFeetPerDay"
.Interestingly, if I specify the unit directly, like
UnitAbbreviationsCache.Default.GetDefaultAbbreviation(GasFlowRateUnit.StandardCubicMetersPerDay),
it retrieves the abbreviation without any issue.But when I send the unit as a parameter to a function, e.g.,
GetAbbreviation(quantity, GasFlowRateUnit.StandardCubicMetersPerDay)
, it throws the aforementioned error.I've made sure that the unit is being passed correctly, and the enumeration value seems to be in the right format. I've attempted to cast the enum to its specific type and used various methods to handle it, but the issue persists.
Here's a snippet of the relevant code:
Is there something specific I need to be aware of when working with custom units and abbreviations in units.net? Any insights or suggestions on how to resolve this issue would be greatly appreciated.
Thank you in advance for your assistance!
The text was updated successfully, but these errors were encountered: