c# - 使用枚举实现层次结构的最佳 C# 模式是什么?

标签 c# enums hierarchy

我正在实现代表距离(或长度)的值类型。 有一个枚举代表不同的度量单位,例如:

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 ....

...等等,以及一个手工编码的不可变距离,旨在表示任何度量:

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
    }
}

前面讨论了是否应通过调用代码将距离转换为正确的 UOM,此处的目标是让 ToString 在当前 UnitOfMeasure 表示的相同测量值(英制或公制)上向上或向下转换值.

显然,这都可以硬编码到 ToString 方法中,但考虑到我还在为整个 shibang 实现 TypeConverters 和 FormatProviders,我想找到一种通用方法来从 DistanceUnit 中找出什么适当的下一个或下一个下一个度量单位将是。

我想以这种方式实现是不是找错了地方?

最佳答案

你真的需要一个 enum 吗?也许,一个简单的 value object会怎样?

public class Distance
{
    private readonly decimal millimeters;

    public decimal Meters
    { 
        get { return millimeters * 0.001m; } 
    }

    private Distance(decimal millimeters)
    {
        this.millimeters = millimeters;
    }

    public static Distance Yards(decimal yards)
    {
        return new Distance(yards * 914.4m);
    }
}

通过扩展方法,您和正确定义的运算符可以获得非常类似于 Ruby 的语法:

var theWholeNineYards = 9.Yards() + 34.Inches();

关于c# - 使用枚举实现层次结构的最佳 C# 模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3975515/

相关文章:

c# - 如何在我的 ASP.NET 站点中显示另一个站点的 RSS 提要?

java - 如何从值转换为枚举?

ios - 确定关联枚举中的哪个枚举

c# - 在下拉列表中显示层次结构

select - Vaadin - com.vaadin.ui.Select - 缩进

C# Winforms WebBrowser 在默认浏览器中打开链接

sql-server - BLToolKit 保存 null 而不是 0

c# - C# 中的 Windows 时区下拉菜单

c++ - 枚举类型的命名空间 - 最佳实践

d3.js - TreeMap 方向