У меня возникли трудности с работой с некоторыми устаревшими перечислениями, которые имеют несколько нулевых значений. Всякий раз, когда я вызываю 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
}
Редактировать
Я понимаю, что имея несколько элементов с одинаковым значением не рекомендуется, однако перечисление в вопросе определяется в унаследованной сборки, я не могу изменить. На самом деле, есть 12 открытых перечислений в mscorlib v4, которые нарушают эту рекомендацию, как определено по следующей простой 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();
Это обычная практика, чтобы только один нулевое значение. На самом деле общепринятой практикой является отсутствие каких-либо повторяющихся значений. Это перечисление, и существует неотъемлемая опасность, полагающаяся на ценность «поддержки». –
Можете ли вы показать код, как эти флаги используются? Используются ли они как бит-маски? – Maggie
Поскольку это совершенно нежелательное поведение, вы можете отправить отчет об ошибке: http://connect.microsoft.com. – Heinzi