我正在实现表示距离(或长度)的值类型。 有一个枚举来表示不同的度量单位,例如:
public enum DistanceUnit
{
Millimeter,
Centimeter,
Meter,
Kilometer,
Inch,
Foot,
Yard,
Mile
};
这些测量值分为两种系统——米制或英制。由于枚举不支持层次结构,那么表示此层次结构的最佳模式是什么?使用位标志?还是使用两个单独的枚举类型以及一些方法来关联它们?还是声明静态成员而不是枚举类型?
给我一些建议...你会如何实现这个?
编辑-更多澄清: 我有几个不可变结构(由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 ....
... 以及一个手写不可变的Distance,旨在表示任何度量:
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方法能够在表示当前度量单位(英制或公制)的相同度量上向上或向下转换值。
显然,所有这些都可以硬编码到ToString方法中,但考虑到我还要为整个过程实现TypeConverters和FormatProviders,我希望找到一种通用的方法,从DistanceUnit中找出适当的下一个或上一个度量单位。
如果我想以这种方式实施,那么我是在做无用功吗?