Получение имен элементов из перечислений с несколькими нулевыми значениями

У меня возникают трудности при работе с некоторыми унаследованными перечислениями, которые имеют несколько нулевых значений. Всякий раз, когда я вызываю ToString для одного из ненулевых значений, все значения, кроме первого нулевого, включаются.

Есть ли способ изолировать имя ненулевого значения, не прибегая к манипуляциям со строкой или отражению?

//all of the following output "Nada, Zilch, One"
Console.WriteLine(TestEnum.One);
Console.WriteLine(Convert.ToString(TestEnum.One));
Console.WriteLine(TypeDescriptor.GetConverter(typeof(TestEnum))
                      .ConvertToString(TestEnum.One));

[Flags]
enum TestEnum
{
    Zero = 0,
    Nada = 0,
    Zilch = 0,
    One = 1
}

Edit

Я понимаю, что иметь несколько элементов с одинаковым значением не рекомендуется, однако рассматриваемое перечисление определено в унаследованной сборке, которую я не могу изменить. На самом деле, в mscorlib v4 есть 12 публичных перечислений, которые нарушают эту рекомендацию, что определяется следующим простым LINQ запросом:

var types = typeof (void).Assembly.GetTypes()
    .Where(type => type.IsEnum &&
                   type.IsPublic &&
                   Enum.GetValues(type).Cast<object>()
                       .GroupBy(value => value)
                       .Any(grp => grp.Count() > 1))
    .ToList();
7
задан Nathan Baulch 31 January 2012 в 03:21
поделиться