枚举转换的通用字符串

kof*_*fus 14 c# generics

假设枚举:

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)

  • 这是正确的答案,但重要的是要注意"默认"枚举是由0表示的任何值.这通常是第一个值.但是,如果你的枚举从1开始,你将返回"0"而不是枚举中的任何合法值.使用此方法需要对此行为或某些编码标准提出警告.例如,我已经看到一些枚举,其中"NONE"值是最后一个值,这在此方法中不起作用. (5认同)

Cha*_*ana 5

不是你尝试它的方式,但我使用下面的方法来做到这一点:

 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)

这里没有例外......