的考慮下面的枚舉:優先枚舉名
[Flags]
public enum Intervals
{
Root = PerfectUnison,
Unison = PerfectUnison,
PerfectUnison = 1 << 0,
AugmentedUnison = MinorSecond,
MinorSecond = 1 << 1,
Second = MajorSecond,
MajorSecond = 1 << 2,
AugmentedSecond = MinorThird,
MinorThird = 1 << 3,
Third = MajorThird,
MajorThird = 1 << 4,
AugmentedThird = PerfectFourth,
DoubleAugmentedThird = Triton,
DiminishedFourth = MajorThird,
Fourth = PerfectFourth,
PerfectFourth = 1 << 5,
AugmentedFourth = Triton,
DoubleAugmentedFourth = PerfectFifth,
Triton = 1 << 6,
//...Removed for brevity, see link to code bellow
}
我想這個簡單的測試:
static void Main(string[] args)
{
var values = Enum.GetValues(typeof(Intervals));
foreach (var value in values)
{
Console.WriteLine(value);
}
}
這裏是輸出:
PerfectUnison,PerfectUnison, PerfectUnison,AugmentedUnison,AugmentedUnison,Second,Second,MinorThird,MinorThird,DiminishedFourth,DiminishedFourth,DiminishedFourth,AugmentedThird,AugmentedThi RD,AugmentedThird,AugmentedThird,DoubleDiminishedSixth,DoubleDiminishedSixth等
雖然我想選擇用於相同的值枚舉名稱爲以下序列組成:
根,MinorSecond,第二,MinorThird,第三,四,海衛,五,MinorSixth,第六,MinorSeventh,七,八度,MinorNinth,第九,第十,第十一,MajorEleventh,十三
一個很好的再現也將是Enum.GetNames
。我希望上述組的名稱應該總是在它們的值匹配名稱之前。
我基本上是在尋找每個值的枚舉名稱優先級/優先級規則的文檔。
你可以在這裏使用代碼:http://rextester.com/EJOWK87857。
更新
我現在正在研究反編譯Enum.GetNames
。看起來它使用反射。那麼問題是,「如何控制反射場的順序?」。
AFAIK,這是不雷爾可能。例如,[Enum.GetName](http://msdn.microsoft.com/en-us/library/system.enum.getname.aspx)方法明確提到您不應該依賴於檢索名稱的一致結果具有重複值的枚舉。您可以使用'Enum.GetNames'(它會根據需要返回值),然後使用這些名稱依次使用[Enum.Parse](http://msdn.microsoft.com/en-us /library/essfb559%28v=vs.90%29.aspx)method.EDIT:但是'Parse'的結果仍然是重複的,而不是原件;不知道這是否有幫助。 – 2013-05-12 02:25:11
@ChrisSinclair我現在正在研究反編譯的'Enum.GetNames'。看起來它使用反射。那麼問題是,「如何控制反射場的順序?」。 – Shimmy 2013-05-12 02:48:18