Учитывая следующее перечисление:Внеочередные имен перечислений
[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 го, AugmentedThird, AugmentedThird, DoubleDiminishedSixth, DoubleDiminishedSixth и т.д.
В то время как я хочу, чтобы имена перечислений, выбранные для одинаковых значений, чтобы быть в следующей последовательности:
Root, MinorSecond, Во-вторых, MinorThird, В-третьих, В-четвертые, Triton, Пятый, MinorSixth, шестой, MinorSeventh, седьмой, октава, MinorNinth, девятый, десятый, одиннадцатый, MajorEleventh, Тринадцать
хорошее воспроизведение также будет Enum.GetNames
. Я хочу, чтобы имена вышеуказанной группы всегда должны предшествовать именам сопоставления значений.
В основном я ищу документацию о правилах приоритета/приоритета имен перечислений на каждое значение.
Вы можете поиграть с кодом здесь: http://rextester.com/EJOWK87857.
Update
Я теперь, глядя в декомпилируемой 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' будут по-прежнему повторяться, а не оригиналы; не уверен, что это помогает. –
@ChrisSinclair Теперь я изучаю декомпилированные 'Enum.GetNames'. Похоже, он использует отражение. Поэтому возникает вопрос: «Как контролировать порядок отраженных полей?». – Shimmy