Мы пишем приложение для преобразования данных.UnitsNet - лучший способ сделать преобразование единицы времени исполнения.
У нас есть 10 из 1000 уравнений, которые необходимо извлечь в шаблон aka 'model'.
Модель будет принимать наиболее распространенную единицу измерения для заданной системы уравнений.
Затем каждое значение уравнения должно быть скорректировано для обеспечения того, чтобы его значение соответствовало единице измерения на модели.
Итак, я хочу использовать UnitsNet для преобразования значений переменных с заданной исходной переменной и ее единицей в целевое устройство.
Проблема, которую я имею, заключается в том, что во время компиляции мы не знаем, что такое исходный блок, и целевой единицы.
Все, что у нас есть, это аббревиатуры исходной и целевой единицы в уравнении, которое входит во время выполнения (и некоторые из них будут настраиваться).
Простой пример:
Цель Единица измерения: мА (Miliamperes) Источник уравнение: Is = 8А (Ампер)
Мы должны быть в состоянии распознавать единицы измерения из аббревиатуры, сравнить его с целевой блок, а затем соответствующим образом отрегулировать значение:
например в приведенном выше случае мы умножим 8 ампер на 1000, чтобы равняться 8000 Милиампера.
Я не вижу краткий способ сделать это с помощью UnitsNet.
Что-то сырой, как это все, что я до сих пор (это тест блок написано в XUnit):
[Theory]
[InlineData("A", "mA", "8")]
public void DoConversion(string sourceUnit, string targetUnit, string variableValue)
{
double result = 0;
ElectricCurrent sourceCurrent;
if (ElectricCurrent.TryParse($"{variableValue}{sourceUnit}", out sourceCurrent))
{
ElectricCurrent targetCurrent;
if (ElectricCurrent.TryParse($"1{targetUnit}", out targetCurrent))
{
var electricCurrentUnit = GetElectricCurrentUnitFromAbbreviation(targetUnit);
if (electricCurrentUnit == ElectricCurrentUnit.Ampere)
{
result = sourceCurrent.Amperes;
}
if (electricCurrentUnit == ElectricCurrentUnit.Milliampere)
{
result = sourceCurrent.Milliamperes;
}
}
}
result.Should().Be(8000);
// TODO: Add every other combination of all possible Units and their Scales- OMG!!!
}
private ElectricCurrentUnit GetElectricCurrentUnitFromAbbreviation(string abbreviation)
{
// Is there a better way to determine WHICH ElectricCurrentUnit the target is?
if (abbreviation == "A")
return ElectricCurrentUnit.Ampere;
if (abbreviation == "mA")
return ElectricCurrentUnit.Milliampere;
return ElectricCurrentUnit.Undefined;
}
Но список возможных единиц мы должны обслуживать большой, так что я не» я хочу написать так.
Кажется, что должен быть лучший способ.
Был бы очень признателен за понимание вашего эксперта.
@anjdreas Любой вход на этот? – JTech
На начальном этапе всего несколько базовых единиц и сотни производных единиц при рассмотрении всех комбинаций и полномочий. Кажется, вам нужна библиотека разных единиц, которая может обрабатывать производные единицы из перегрузки оператора (я сам написал). Это непросто, но, смотря на [UnitsNet] (https://github.com/anjdreas/UnitsNet), это не похоже на хорошую работу для вашего проекта. – ja72
Его проект по электротехнике и из того, что я могу видеть в UnitsNet, сгенерированный код в пространстве имен UnitClasses охватывает большинство вещей, которые нам нужны. Итак, ради вышесказанного, давайте предположим, что нам не нужны никакие юниты, кроме тех, которые включены в UnitsNet, - почему тогда вы сказали бы, что UnitsNet не подходит? – JTech