Я создаю функцию для расширения концепции Enum.Parse
, которая
- Позволяет анализировать значение по умолчанию, если значение Enum не найдено
- Нечувствителен к регистру
Итак, я написал следующее:
public static T GetEnumFromString<T>(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
.
Достаточно справедливо, но есть ли обходной путь, чтобы позволить Generic Enum, или мне придется подражать функции Parse
и передать тип как атрибут, что вынуждает уродливое требование к боксу вашему коду.
EDIT Все предложения, приведенные ниже, были очень благодарны, спасибо.
Остановились (я оставил цикл, чтобы поддерживать нечувствительность к регистру - я использую это при анализе XML)
public static class EnumUtils
{
public static T ParseEnum<T>(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 # ниже, который стоит посмотреть, и upvote. Я удалю это редактирование, если решение пузырится дальше страницы.