Создать универсальный метод, ограничивающий T EnumC#

Место общения программистов C#
Ответить
Anonymous
 Создать универсальный метод, ограничивающий T Enum

Сообщение Anonymous »

Я создаю функцию, расширяющую концепцию Enum.Parse, которая
  • позволяет анализировать значение по умолчанию в случае, если Значение перечисления не найдено.
  • Не чувствительно к регистру.
Поэтому я написал следующее:

Код: Выделить всё

public static T GetEnumFromString(string value, T defaultValue) where T : Enum
{
if (string.IsNullOrEmpty(value)) return defaultValue;
foreach (T item in Enum.GetValues(typeof(T)))
{
if (item.ToString().ToLower().Equals(value.Trim().ToLower())) return item;
}
return defaultValue;
}
Я получаю сообщение об ограничении ошибки, которое не может быть специальным классом System.Enum.
Достаточно справедливо, но есть ли обходной путь, позволяющий общее перечисление, или мне придется имитировать функцию Parse и передавать тип в качестве атрибута, что приводит к уродливым требованиям к упаковке в вашем коде.
РЕДАКТИРОВАТЬ Все приведенные ниже предложения были высоко оценены, спасибо.
Остановились (я оставил цикл, чтобы сохранить нечувствительность к регистру - я использую это при анализе XML)

Код: Выделить всё

public static class EnumUtils
{
public static T ParseEnum(string value, T defaultValue) where T : struct, IConvertible
{
if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type");
if (string.IsNullOrEmpty(value)) return defaultValue;

foreach (T item in Enum.GetValues(typeof(T)))
{
if (item.ToString().ToLower().Equals(value.Trim().ToLower())) return item;
}
return defaultValue;
}
}
РЕДАКТИРОВАТЬ: (16 февраля 2015 г.) Кристофер Карренс опубликовал ниже типовое безопасное универсальное решение с поддержкой компилятора на MSIL или F#, на которое стоит обратить внимание: и плюс. Я удалю это изменение, если решение появится дальше на странице.
РЕДАКТИРОВАТЬ 2: (13 апреля 2021 г.). Поскольку теперь эта проблема решена и поддерживается, начиная с C# 7.3, я изменил принятый ответ, хотя полное прочтение основных ответов стоит ради академического и исторического интереса :)

Подробнее здесь: https://stackoverflow.com/questions/791 ... to-an-enum
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»