假设枚举:
public enum SysLogsAppTypes { None, MonitorService, MonitorTool };
Run Code Online (Sandbox Code Playgroud)
这是一个从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;
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法制作这个通用?
我试过了:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到:"T"是一个"类型参数",这是不是在给定的情况下有效
那里是T.None
有帮助吗?谢谢
jba*_*all 14
我认为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);
}
}
Run Code Online (Sandbox Code Playgroud)
不是你尝试它的方式,但我使用下面的方法来做到这一点:
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;
}
Run Code Online (Sandbox Code Playgroud)
这里没有例外......