Код: Выделить всё
public abstract class PropertyBase : where TQuantity : IQuantity where TUnit : Enum
{
public string InputString { get; set; }
public TUnit? SelectedUnit
{
get => _selectedUnit;
set
{
var oldUnit = _selectedUnit;
_selectedUnit = value;
if (oldUnit != null) //This check doesn't work
{
//This code should only be run if oldUnit is not null or 0
ConvertInputString(oldUnit, value);
}
}
}
private TUnit? _selectedUnit;
protected abstract TUnit[] AvailableUnits { get; }
protected abstract TQuantity FromValue(double value, TUnit unit);
protected abstract double As(TQuantity quantity, TUnit unit);
private void ConvertInputString(TUnit oldUnit, TUnit newUnit)
{
//Parses and converts values in InputString
}
protected List ParseInputValues(string input)
{
//...
}
}
public class InputPropertyAngles : PropertyBase, IInputProperty
{
public InputPropertyAngle()
{
SelectedUnit = AngleUnit.Degree;
}
public override double[] ValuesInSi
{
get
{
var values = ParseInputValues(InputString).ToArray();
return values.Select(value => Angle.From(value, SelectedUnit).Degrees).ToArray();
}
}
protected override AngleUnit[] AvailableUnits => [AngleUnit.Degree, AngleUnit.Radian];
protected override Angle FromValue(double value, AngleUnit unit) => Angle.From(value, unit);
protected override double As(Angle quantity, AngleUnit unit) => quantity.As(unit);
}
Идея состоит в том, что когда InputPropertyAngle создан экземпляр, а для SelectedUnit в конструкторе установлена единица измерения по умолчанию, ConvertInputString не следует запускать. Это делается путем проверки того, что oldUnit имеет значение null (
Код: Выделить всё
if (oldUnit != null)). Однако, поскольку oldUnitК счастью, в библиотеке UnitsNet, в AngleUnit Enum, 0 не представляет никакого значимого значения. Поэтому я подумал, что могу заменить эту проверку на if (oldUnit != 0), но компилятор говорит: «Невозможно применить оператор '!=' к операндам типа «TUnit» и «int». К сожалению, я не могу ограничить TUnit чем-то более конкретным, чем Enum, потому что AngleUnit, lengthUnit, MassUnit и другие Enum, полученные из UnitsNet, не имеют общего интерфейса (и насколько я понимаю, в Enums этого вообще не может быть).
Каков наиболее элегантный способ решить эту проблему, чтобы сделать возможным проверку нуля?
Подробнее здесь: https://stackoverflow.com/questions/793 ... -has-value
Мобильная версия