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

用枚举实现层次结构的最佳C#模式是什么?,第1张

概述我正在实现代表距离(或长度)的值类型. 有一个枚举代表不同的度量单位,例如: public enum DistanceUnit { Millimeter, Centimeter, Meter, Kilometer, Inch, Foot, Yard, Mile}; 这些测量属于两个系统之一,即公制或英制.由于枚举不支持层次结构,因此表示此层次结构 我正在实现代表距离(或长度)的值类型.
有一个枚举代表不同的度量单位,例如:
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>,...                       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,上一个或下一个下降单位.

我以这种方式实行这个错误的树吗?

解决方法 你真的需要一个枚举吗?也许,一个简单的 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#模式是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1263264.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存