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