Общая строка для преобразования перечисления
Предположим, что перечисление:
public enum SysLogsAppTypes { None, MonitorService, MonitorTool };
и вот функция для преобразования из представления ToString()
обратно в enum
:
private SysLogsAppTypes Str2SysLogsAppTypes(string str)
{
try
{
SysLogsAppTypes res = (SysLogsAppTypes)Enum
.Parse(typeof(SysLogsAppTypes), str);
if (!Enum.IsDefined(typeof(SysLogsAppTypes), res))
return SysLogsAppTypes.None;
return res;
}
catch
{
return SysLogsAppTypes.None;
}
}
Есть ли способ сделать это Generic?
Я пробовал:
private T Str2enum<T>(string str)
{
try
{
T res = (T)Enum.Parse(typeof(T), str);
if (!Enum.IsDefined(typeof(T), res)) return T.None;
return res;
}
catch
{
return T.None;
}
}
но я получаю:
"T" - это "параметр типа", который недействителен в данном контексте
где T.None
Любая помощь?
Спасибо
Ответы
Ответ 1
Я думаю, что ключевое слово default
- это то, что вам нужно:
private T Str2enum<T>(string str) where T : struct
{
try
{
T res = (T)Enum.Parse(typeof(T), str);
if (!Enum.IsDefined(typeof(T), res)) return default(T);
return res;
}
catch
{
return default(T);
}
}
Ответ 2
Не так, как вы его пытаетесь, но я использую следующий метод:
public static bool EnumTryParse<E>(string enumVal, out E resOut)
where E : struct
{
var enumValFxd = enumVal.Replace(' ', '_');
if (Enum.IsDefined(typeof(E), enumValFxd))
{
resOut = (E)Enum.Parse(typeof(E),
enumValFxd, true);
return true;
}
// ----------------------------------------
foreach (var value in
Enum.GetNames(typeof (E)).Where(value =>
value.Equals(enumValFxd,
StringComparison.OrdinalIgnoreCase)))
{
resOut = (E)Enum.Parse(typeof(E), value);
return true;
}
resOut = default(E);
return false;
}
Никаких исключений, брошенных здесь...
Ответ 3
Мне нравится добавлять параметр defaultValue
для перегрузки моего TryParse
для случаев, когда я хочу по умолчанию, если он не может быть разобран или равен нулю. Это наиболее полезно для синтаксического анализа string.Empty
или null
.
Примечание: эта реализация вернется к defaultValue
, если передается значение нежелательной почты, поэтому вы можете настроить ее, выбросив исключение.
public static T TryParse<T>(string value, T defaultValue) where T: struct
{
if (string.IsNullOrWhiteSpace(value))
{
return defaultValue;
}
T result;
if (Enum.TryParse<T>(value, out result))
{
return result;
}
else
{
return defaultValue; // you may want to throw exception here
}
}
}
ConverterMode mode = EnumUtils<ConverterMode>.TryParse(stringValue, ConverterMode.DefaultMode);
Ответ 4
Я знаю, что это старо, но на основе нескольких образцов, которые я исследовал вместе с @Simon_Weaver, это то, что у меня есть:
public static T TryParse(String value, T defaultValue) where T : struct {
if (String.IsNullOrWhiteSpace(value)) {
return defaultValue;
}
T result;
if (!Enum.TryParse(value, out result)) {
if (Enum.IsDefined(typeof (T), result) | result.ToString().Contains(",")) {
// do nothing
} else {
result = defaultValue;
}
} else {
result = defaultValue;
}
return result;
}