Какой лучший шаблон C # для реализации иерархии с перечислением?

Я реализую типы значений, которые представляют расстояние (или длину). Существует перечисление, которое представляет различные единицы измерения, например:

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, что будет дальше единица измерения вверх или вниз будет.

Я лаю не на том дереве, желая реализовать таким образом?

Ответы на вопрос(3)

Ваш ответ на вопрос