枚举转换的通用字符串

时间:2010-10-06 23:46:38

标签: c# generics

假设枚举:

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

有任何帮助吗? 谢谢

4 个答案:

答案 0 :(得分:13)

我认为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);   
    }   
}   

答案 1 :(得分: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;
 }

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

答案 2 :(得分:2)

我喜欢在defaultValue参数中添加TryParse的重载,以用于我想要默认的情况(如果无法解析或为空)。这对于解析string.Emptynull非常有用。

注意:如果传入垃圾值,此实现将恢复为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);

答案 3 :(得分:0)

我知道这已经过时了,但基于一些样本,我已经与@Simon_Weaver's解决方案一起进行了研究,这就是我所拥有的:

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;
}