У меня есть следующие методы в перечислимом классе помощника (я упростил его в целях вопроса):
static class EnumHelper
{
public enum EnumType1 : int
{
Unknown = 0,
Yes = 1,
No = 2
}
public enum EnumType2 : int
{
Unknown = 0,
Dog = 1,
Cat = 2,
Bird = 3
}
public enum EnumType3
{
Unknown,
iPhone,
Andriod,
WindowsPhone7,
Palm
}
public static EnumType1 ConvertToEnumType1(string value)
{
return (string.IsNullOrEmpty(value)) ?
EnumType1.Unknown :
(EnumType1)(Enum.Parse(typeof(EnumType1), value, true));
}
public static EnumType2 ConvertToEnumType2(string value)
{
return (string.IsNullOrEmpty(value)) ?
EnumType2.Unknown :
(EnumType2)(Enum.Parse(typeof(EnumType2), value, true));
}
public static EnumType3 ConvertToEnumType3(string value)
{
return (string.IsNullOrEmpty(value)) ?
EnumType3.Unknown :
(EnumType3)(Enum.Parse(typeof(EnumType3), value, true));
}
}
Таким образом, вопрос здесь, могу я обрезать это вниз к Перечислимому дополнительному методу или возможно некоторому типу отдельного метода, который может обработать любой тип. Я нашел, что некоторые примеры делают так с основными перечислениями, но различием в моем примере являются все перечисления, имеют Unknown
объект, в котором я нуждаюсь, возвратился, если строка является пустой или пустой (если никакое соответствие не найдено, я хочу, чтобы это перестало работать).
Поиск чего-то как следующее, возможно:
EnumType1 value = EnumType1.Convert("Yes");
// or
EnumType1 value = EnumHelper.Convert(EnumType1, "Yes");
Одна функция, чтобы сделать все это..., как обработать Unknown
элемент является частью, которой я одержим.
Править: Скорректированный одно из перечислений, которые не будут определены с целыми числами. Таким образом, я могу гарантировать, что 0 будет всегда иметь место, но Unknown
всегда будет правильный текст... Я предполагаю, что мог использовать тот же пример в качестве T (0), но сделать другой синтаксический анализ на "Неизвестном" тексте.
Используйте это, предполагая, что "Неизвестно" всегда равно 0.
public static T ConvertToEnum<T>(this string value) where T : new()
{
if( !typeof(T).IsEnum )
throw new NotSupportedException( "T must be an Enum" );
try
{
return (T)Enum.Parse(typeof(T), value);
}
catch
{
return default(T); // equivalent to (T)0
//return (T)Enum.Parse(typeof(T), "Unknown"));
}
}
Использование:
EnumType2 a = "Cat".ConvertToEnum<EnumType2>();
EnumType2 b = "Person".ConvertToEnum<EnumType2>(); // Unknown
ИЗМЕНИТЬ ОП (Келси): Ваш ответ привел меня к правильному ответу, поэтому я подумал, что включу его здесь:
public static T ConvertTo<T>(this string value)
{
T returnValue = (T)(Enum.Parse(typeof(T), "Unknown", true));
if ((string.IsNullOrEmpty(value) == false) &&
(typeof(T).IsEnum))
{
try { returnValue = (T)(Enum.Parse(typeof(T), value, true)); }
catch { }
}
return returnValue;
}
использовать дженерики ... что-то вроде этого ....
public static TResult ConvertTo<TResult>( this string source )
{
if( !typeof(TResult).IsEnum )
{
throw new NotSupportedException( "TResult must be an Enum" );
}
if (!Enum.GetNames(typeof(TResult)).Contains(source))
return default(TResult);
return (TResult)Enum.Parse( typeof(TResult), source );
}