C#附加属性?枚举

时间:2017-07-05 09:20:55

标签: c# enums attributes

我有一个枚举:

enum RANK
{
    kingdom=0,
    phylum=1,
    order=2,
    family=3,
    genus=4,
    species=5
}

其中每个项目都有父项(上面的排名)和子项(下面的排名)。超出范围的错误(例如,试图找到王国的父母)导致异常。问题是是否可以将一个属性(或任何真正的属性)附加到枚举,以便可以调用它:

RANK child = kingdom.Child;
RANK parent = species.Parent;

我有代码将其称为函数(这是我理解的边界)

public static RANK GetParent(this RANK rank)
    {
        if ((rank - 1) > (RANK)0)
        {
            return rank - 1;
        }
        else
        {
            throw new ArgumentOutOfRangeException("No parent rank");
        }
    }

使用相应的GetChild版本。被称为:

RANK child = kingdom.GetChild();
RANK parent = species.GetPArent();

这让我很烦,因为它不是一个函数调用而是一个变量调用,应该真的这样调用。我愿意接受建议,但是我需要结果中的枚举行为(固定列表并以相同的方式调用,这将接近非技术人员!)只要它看起来像枚举并且表现得像一个枚举,它将作为枚举传递。

2 个答案:

答案 0 :(得分:2)

不,没有扩展属性这样的东西。但是你可以创建自己的类:

public sealed class Rank
{
    private static readonly List<Rank> ranks = new List<Rank>();

    // Important: these must be initialized in order.
    // (That can be avoided, but only at the cost of more code.)        
    public static Rank Kingdom { get; } = new Rank(0);
    public static Rank Phylum { get; } = new Rank(1);
    public static Rank Order { get; } = new Rank(2);
    public static Rank Family { get; } = new Rank(3);
    public static Rank Genus { get; } = new Rank(4);
    public static Rank Species { get; } = new Rank(5);

    private readonly int value;

    // TODO: Change to throw InvalidOperationException (or return null)
    // for boundaries
    public Rank Child => ranks[value + 1];
    public Rank Parent => ranks[value - 1];

    private Rank(int value)
    {
        this.value = value;
        ranks.Add(this);
    }
}

然后你使用:

Rank kingdom = Rank.Kingdom;
Rank phylum = kingdom.Child;
// etc

缺点是您没有获得其他枚举行为,例如切换。

答案 1 :(得分:0)

你能把你的需求包装成一个班级。

public enum Rank
{
    Kingdom,
    Phylum,
    Order,
}

public class Family
{
    public Rank Rank { get; set; }
    public Rank Child => Enum.IsDefined(typeof(Rank), Rank + 1) ? Rank +  1 : throw new ArgumentOutOfRangeException("No child rank");
    public Rank Parent => Enum.IsDefined(typeof(Rank),Rank - 1) ? Rank -  1 : throw new ArgumentOutOfRangeException("No parent rank");

}

用法 -

Family family = new Family();
rank.Rank = Rank.Order;
Rank child = family.Child;
Rank parent = family.Parent; //this will throw an exception