Как я могу проверить, имеет ли общее перечисление значение?C#

Место общения программистов C#
Ответить
Anonymous
 Как я могу проверить, имеет ли общее перечисление значение?

Сообщение Anonymous »

В моем приложении C# у меня есть абстрактный класс, который является оболочкой библиотеки UnitsNet для группировки тесно связанных свойств (таких как числовое значение и единица измерения для этого значения, выбранного пользователем), чтобы ограничить доступные единицы измерения, а также для обработки сложных входных данных пользователя (например, ввода нескольких чисел, например «5, 8, 10:1:20»). Вот базовый класс и один из классов, расширяющих его:

Код: Выделить всё

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);
}
Обратите внимание, что AngleUnit — это Enum, взятый из библиотеки UnitsNet.
Идея состоит в том, что когда InputPropertyAngle создан экземпляр, а для SelectedUnit в конструкторе установлена ​​единица измерения по умолчанию, ConvertInputString не следует запускать. Это делается путем проверки того, что oldUnit имеет значение null (

Код: Выделить всё

if (oldUnit != null)). Однако, поскольку oldUnit
— это TUnit (обобщенный Enum), он не может иметь значение NULL. Во время выполнения он принимает значение 0.
К счастью, в библиотеке UnitsNet, в AngleUnit Enum, 0 не представляет никакого значимого значения. Поэтому я подумал, что могу заменить эту проверку на if (oldUnit != 0), но компилятор говорит: «Невозможно применить оператор '!=' к операндам типа «TUnit» и «int». К сожалению, я не могу ограничить TUnit чем-то более конкретным, чем Enum, потому что AngleUnit, lengthUnit, MassUnit и другие Enum, полученные из UnitsNet, не имеют общего интерфейса (и насколько я понимаю, в Enums этого вообще не может быть).
Каков наиболее элегантный способ решить эту проблему, чтобы сделать возможным проверку нуля?

Подробнее здесь: https://stackoverflow.com/questions/793 ... -has-value
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»