Я реализую типы значений, которые представляют расстояние (или длину).
Существует перечисление, которое представляет различные единицы измерения, например:
public enum DistanceUnit
{
Millimeter,
Centimeter,
Meter,
Kilometer,
Inch,
Foot,
Yard,
Mile
};
Эти измерения относятся к одной из двух систем - метрической или имперской. Поскольку enum не поддерживает иерархии, каков наилучший шаблон для представления этой иерархии?
Это использовать битовые флаги?
Или использовать два отдельных перечисления вместе с некоторыми методами для их корреляции?
Или объявить статические члены вместо перечислений?
Дайте мне совет ... как бы вы реализовали это?
Редактировать - Больше разъяснений:
У меня есть несколько неизменных структур (генерируемых T4), которые представляют различные измерения:
public struct Meters : IEquatable<Distance>,
IEquatable<Meters>,
IEquatable<Millimeters>, ... IComparable<> etc.. etc..
{
public readonly decimal Value;
...
public static implicit operator Distance (Meters other) {
// Can implicitly cast to Distance
}
}
public struct Millimeters ...
public struct Centimeters ....
... и т. Д., А также неизменяемое расстояние с ручным кодированием, предназначенное для представления любого показателя:
public struct Distance : IEquatable<Distance>,
IEquatable<Meters>,
IEquatable<Millimeters>, ...
IFormattable
{
public readonly decimal Value;
public readonly DistanceUnits UnitOfMeasure;
...
public string ToString(string format, IFormatProvider provider)
{
// Logic:
// If UOM = Meters and Value < .1 then display as "10 cm" instead of ".1 M"
// If UOM = Inches and value multiple of 12, display as feet
// etc, etc
}
}
Прежде чем обсуждать, следует ли преобразовывать расстояние в правильную единицу измерения с помощью вызывающего кода, цель состоит в том, чтобы ToString преобразовал значение вверх или вниз в том же измерении (имперском или метрическом), которое представлено текущим модулем UnitOfMeasure .
Очевидно, что все это может быть жестко запрограммировано в метод ToString, но, учитывая, что я также реализую TypeConverters и FormatProviders для всего этого сибанга, я хотел бы найти общий способ выяснить из DistanceUnit, что подходящей следующей или следующей единицей измерения будет.
Я лаю не на том дереве, желая реализовать таким образом?