Units.NET无需重新编译即可添加单位

时间:2015-09-09 14:21:47

标签: nuget units-of-measurement

我们需要动态地在度量单位之间进行转换,而单位.NET似乎是理想的解决方案,但是,它缺少我们需要的一些单位(每分钟加仑)。我知道添加到规范文件并重新创建类是微不足道的,但最好能够简单地使用nuget包。有没有人知道如何在不重新编译Units.NET解决方案的情况下向Units.NET添加单元?

应该注意的是,我们并没有与Units.NET结合,我们只需要能够在任意流量和长度单位之间进行转换。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可能会在Units.NET的github issues page上得到更好的回复。在主lib之外添加自定义单元有一个wiki page,但我承认这部分不是很精致,可以使用改进。

从维基复制:

Units.NET大致由以下部分组成:

  • 单位类,如长度和力
  • 单元枚举,如LengthUnit和ForceUnit
  • 用于存储/查找各种文化中的单元缩写和单元枚举的UnitSystem,由ToString()和Parse()在单元类中使用
  • 用于定义单位,转换函数和缩写的JSON文件
  • 用于生成单元类,单元枚举和测试代码存根的Powershell脚本

由于单位是自己的类,并且您完全控制自定义单位代码,因此扩展是一个模糊的术语,可归结为3个选项:

  1. 手动编写单元类和测试。
  2. 手动编写单元类和测试,但将自定义单元缩写添加到UnitSystem,以便将其重用于Parse()和ToString()方法。
  3. 通过复制powershell脚本并编写自己的.json文件来生成单元类和测试。您必须修改脚本以更改名称空间,文件夹结构以及可能还有其他我不记得的内容。 除此之外,我建议你
  4. 对于选项2和3,将自定义单位缩写添加到UnitSystem是在运行时完成的,如下所示:

    CultureInfo cultureInfo = CultureInfo.GetCultureInfo("en-US");
    UnitSystem unitSystem = UnitSystem.GetCached(cultureInfo);
    unitSystem.MapUnitToAbbreviation(FooUnit.Bar, "bar");
    
    Assert.AreEqual("bar", unitSystem.GetDefaultAbbreviation(FooUnit.Bar));
    Assert.AreEqual(FooUnit.Bar, unitSystem.Parse<FooUnit>("bar");
    

    请参阅Length.cs中的ToString()和Parse()或任何其他单元类,了解我们如何实现这些。