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

| 我有一个关于从字符串解析枚举的怪异问题。就这样,我的应用程序需要处理配置文件中的几个枚举的解析。但是,我不想为每种枚举类型编写解析例程(因为有很多)。 我面临的问题是以下代码显示了一些奇怪的错误-T的类型必须是不可为null的值类型或某种类型。我以为枚举默认情况下不可为空? 如果我使用
where T : enum
限制
T
的类型,则方法主体内的其他所有内容(the2ѭ语句除外)都带有下划线标记为错误。 任何人都可以帮助解决这个奇怪的小问题吗? 谢谢, 马丁
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;
}
用户请求发布错误的文本(在代码时,而不是编译/运行时),因此在这里:   为了在通用类型或方法\'System.Enum.TryParse(string,out TEnum)\'中将其用作参数TEnum,类型\'T \'必须是不可为空的值类型。     
已邀请:
        好的,有了这些信息,我就知道
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     
        
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;
}
    
        由于C#不允许您执行
where T : enum
,因此您必须使用
where T : struct
。 请注意,正如迈克尔建议的那样,有一些方法可以解决该限制。     

要回复问题请先登录注册