c#中的通用枚举字符串值解析器?

时间:2011-06-14 17:13:05

标签: c# enums enumeration text-parsing

我有一个关于从字符串解析枚举的奇怪问题。实际上,我的应用程序需要处理从配置文件中解析几个枚举。但是,我不想为每个枚举类型编写解析例程(因为有很多)。

我面临的问题是以下代码显示了一些奇怪的错误 - T的类型必须是不可为空的值类型或类似的东西。我认为枚举默认是不可空的?

如果我使用T限制where T : enum的类型,则方法正文中的所有其他内容(if Enum.TryParse语句除外)都会加下划线错误。

任何人都可以帮助解决这个奇怪的小问题吗?

谢谢, 马丁

public static T GetConfigEnumValue<T>(NameValueCollection config,
                                      string configKey, 
                                      T defaultValue) // where T : enum ?
{
    if (config == null)
    {
        return defaultValue;
    }

    if (config[configKey] == null)
    {
        return defaultValue;
    }

    T result = defaultValue;
    string configValue = config[configKey].Trim();

    if (string.IsNullOrEmpty(configValue))
    {
        return defaultValue;
    }

    //Gives me an Error - T has to be a non nullable value type?
    if( ! Enum.TryParse<T>(configValue, out result) )
    {
        result = defaultValue;
    }

    //Gives me the same error:
    //if( ! Enum.TryParse<typeof(T)>(configValue, out result) )  ...

    return result;
}

用户请求发布错误的文本(它是在代码时,而不是编译/运行时),所以在这里:

  

类型'T'必须是非可空值类型才能在泛型类型或方法'System.Enum.TryParse(string,out TEnum)'中使用它作为参数TEnum

4 个答案:

答案 0 :(得分:1)

好的,考虑到这些信息,我看到了Enum.TryParse方法抱怨的内容。

对方法设置通用约束,如下所示:

public static T GetConfigEnumValue<T>(NameValueCollection config, 
                                      string configKey, 
                                      T defaultValue) // where T : ValueType

或者只是放置Enum.TryParse方法上的相同约束。

where T : struct, new()

你可以在这里找到这个定义:

http://msdn.microsoft.com/en-us/library/dd783499.aspx

答案 1 :(得分:1)

public static T GetConfigEnumValue<T>(NameValueCollection config, string configKey, T defaultValue)
{
    if (config == null)
    {
        return defaultValue;
    }

    if (config[configKey] == null)
    {
        return defaultValue;
    }

    T result = defaultValue;
    string configValue = config[configKey].Trim();

    if (string.IsNullOrEmpty(configValue))
    {
        return defaultValue;
    }

    try
    {
        result = (T)Enum.Parse(typeof(T), configValue, true);
    }
    catch
    {
        result = defaultValue;
    }

    return result;
}

答案 2 :(得分:0)

由于C#不允许您where T : enum,因此您必须使用where T : struct

请注意,有Michael建议限制此限制。

答案 3 :(得分:0)

你可以在这里找到答案 Create Generic method constraining T to an Enum