猿问

创建将T约束为Enum的泛型方法

创建将T约束为Enum的泛型方法

我正在构建一个函数来扩展Enum.Parse概念

  • 允许在找不到Enum值时解析默认值
  • 不区分大小写

所以我写了如下:

public static T GetEnumFromString<T>(string value, T defaultValue) where T : Enum{
    if (string.IsNullOrEmpty(value)) return defaultValue;
    foreach (T item in Enum.GetValues(typeof(T)))
    {
        if (item.ToString().ToLower().Equals(value.Trim().ToLower())) return item;
    }
    return defaultValue;}

我得到的错误约束不能是特殊类System.Enum.

很公平,但是否存在允许泛型Enum的解决方案,或者我将不得不模仿Parse函数并将一个类型作为属性传递,这会将丑陋的装箱要求强制到您的代码中。

编辑下面的所有建议都非常感谢,谢谢。

已经决定了(为了保持大小写不敏感,我留下了循环-我在解析XML时使用了这个)

public static class EnumUtils{
    public static T ParseEnum<T>(string value, T defaultValue) where T : struct, IConvertible
    {
        if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type");
        if (string.IsNullOrEmpty(value)) return defaultValue;

        foreach (T item in Enum.GetValues(typeof(T)))
        {
            if (item.ToString().ToLower().Equals(value.Trim().ToLower())) return item;
        }
        return defaultValue;
    }}

编辑:Julien Lebosquain最近发布了编译器强制使用msil或F#中的类型安全泛型解决方案。下面,这很值得一看,并且值得一看。我将删除此编辑,如果解决方案气泡更高的页面。


慕娘9325324
浏览 1532回答 3
3回答

炎炎设计

自Enum类型工具IConvertible接口,更好的实现应该如下所示:public&nbsp;T&nbsp;GetEnumFromString<T>(string&nbsp;value)&nbsp;where&nbsp;T&nbsp;:&nbsp;struct,&nbsp;IConvertible{ &nbsp;&nbsp;&nbsp;if&nbsp;(!typeof(T).IsEnum)&nbsp; &nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ArgumentException("T&nbsp;must&nbsp;be&nbsp;an&nbsp;enumerated&nbsp;type"); &nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;//...}这仍然允许传递实现的值类型。IConvertible..但这种可能性很小。
随时随地看视频慕课网APP
我要回答