c# - 分组枚举最佳实践

标签 c# enums

<分区>

如果您有一个枚举,其中的值可以自然地分组到子集中。例如:

[Flags]
public enum Instrument
{
    Lute,
    Guitar,
    Flute,
    Drum
}
[Flags]
public enum InstrumentType
{
    Percussion,
    String,
    Wind,
}

有很多方法可以做到这一点

1) 要将这些数据合并到一个单独的 Enum 中?

[Flags]
public enum ValidInstrument
{
    Lute= Instrument.Lute| InstrumentType.String,
    Guitar = Instrument.Guitar | InstrumentType.String,
    Flute = Instrument.Flute | InstrumentType.Wind,
    Drum = Instrument.Drum | InstrumentType.Percussion,
}

(假设枚举之间没有交叉值) 这将允许你做

(ValidInstrument | InstrumentType.String) == InstrumentType.String

判断一个乐器是不是弦乐器

2) 创建某种映射结构来做完全相同的事情?

public static InstrumentType GetInstrumentType(Instrument inst)
{
    switch(inst)
    {
    case Instrument.Lute:
    case Instrument.Guitar:
        return InstrumentType.String
    //etc.
    }
}

3)属性?

public enum Instrument
{
    [InstrumentType(InstrumentType.String)]
    Lute,
    [InstrumentType(InstrumentType.String)]
    Guitar,
    [InstrumentType(InstrumentType.Wind)]
    Flute,
    [InstrumentType(InstrumentType.Percussion)]
    Drum
}

4) 在独立类(class)中?

public class ValidInstrument
{
public InstrumentType Type{get;set;}
public Instrument Instrument{get;set;}
}

使用静态运行时填充

这些方法中哪种更好,或者如果取决于情况,哪些因素会影响选择

最佳答案

一开始讲事物之间的关系,感觉就像在讲继承。最佳做法是将其表示为类结构。

class Instrument
{
    void Play();
}

class StringedInstrument : Instrument
{
    void Strum();
}

class Guitar : StringedInstrument
{
}

使用工厂类/方法和一些其他设计模式,您应该能够处理相同的事情,枚举可以让您处理,但还有许多您永远无法用枚举处理的事情。

如果您想找到所有演奏弦乐器的乐队成员,您只需让所有成员的乐器"is"弦乐器即可。这应该能够在 C# 中通过调用 Type.IsSubclassOf() 来完成。

如果开发人员随后创建了一个继承自 StringedInstrumentFlute 类,如您在上面的评论中所述,您应该解雇该开发人员! :) 如果您正在谈论将 Flute 对象分配给 StringedInstrument 实例,C# 会阻止这种情况,因为转换无效。您可以将 Flute 转换为 WindInstrumentInstrument,但绝不能转换为 StringedInstrument,除非开发人员错误地使其继承自仪器类型错误。

关于c# - 分组枚举最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30780759/

相关文章:

swift - 创建枚举实例

ios - Mantle - 将字符串转换为枚举值

c++ - Q_ENUM 中索引的值

c++ - 如何以通用方式从 std::istream 读取枚举

c# - 字典使用不当?

c# - 语法错误, '>' 应为 MVC Razor

c# - 无效的对象名称 SQL 选择

c# - Cookie 过期在 C# 中不起作用

javascript - 在 asp.net 按钮上使用 JQUERY 从 ajax 模态扩展器单击重定向到 asp.net 页面

java - 在 Java 中使用带有枚举的静态方法