我为字符串添加了一些扩展方法,以便更轻松地使用某些自定义枚举。
public static Enum ToEnum<T>(this string s)
{
return (Enum)Enum.Parse(typeof(T), s);
}
public static bool IsEnum<T>(this string s)
{
return Enum.IsDefined(typeof(T), s);
}
注意 - 由于泛型类型约束的限制,我必须编写如上所述的方法。我很乐意使用T ToEnum(这个字符串s),其中T:Enum在拨打电话后避免演员......但是没有办法。
无论如何,我认为将这个概念扩展一点以便返回Enum会很好吗?在那些方法签名可以接受各种可以为空的枚举的情况下。
public static Enum? ToEnumSafe<T>(this string s)
{
return (IsEnum<T>(s) ? (Enum)Enum.Parse(typeof(T), s) : null);
}
但是,由于编译器错误,这是不可行的。
error CS0453: The type 'System.Enum' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'System.Nullable<T>'
我不得不承认我在这里有点困惑作为Enum?应该是合法的返回值,不是吗?我尝试了类似的东西,但最终得到了同样的错误。
public static T? ToEnumSafe<T>(this string s)
{
return (IsEnum<T>(s) ? (T)Enum.Parse(typeof(T), s) : null);
}
我甚至决定重写方法来删除泛型,我得到更多相同的东西:
public static bool IsEnum(this string s, Type T)
{
return Enum.IsDefined(T, s);
}
public static Enum? ToEnumSafe(this string s, Type T)
{
return (IsEnum(s, T) ? (Enum)Enum.Parse(T, s) : null);
}
我在这里错过了一些非常愚蠢的东西吗?
答案 0 :(得分:5)
尝试:
public static T? ToEnumSafe<T>(this string s) where T : struct
{
return (IsEnum<T>(s) ? (T?)Enum.Parse(typeof(T), s) : null);
}
答案 1 :(得分:3)
实际上你可以做得更好 - 稍微有点工作。
虽然C#不支持通用约束来说T必须是枚举类型,但CLR确实如此。我有一个名为Unconstrained Melody的项目,它是一个“与枚举有用的东西”的库。我怀疑它已经处理了你想要的东西(只要你只需要在枚举中使用名称,而不是整数值的字符串表示)。虽然它没有IsDefined(string)
,但它确实有TryParse
,可以完成同样的工作。
有关详细信息,请参阅this blog post。
至于为什么Enum?
不是有效的返回类型 - System.Enum
本身是一个引用类型(就像System.ValueType
),所以它已经可以为空了。您只能将?
与不可为空的值类型一起使用。
答案 2 :(得分:0)
public static Enum ToEnum<T>(this string s)
{
return (Enum)Enum.Parse(typeof(T), s);
}
应该是
public static T ToEnum<T>(this string s)
{
return (T)Enum.Parse(typeof(T), s);
}
还可以解决以下问题
public static Enum? ToEnumSafe<T>(this string s)
{
return (IsEnum<T>(s) ? (Enum)Enum.Parse(typeof(T), s) : null);
}
到
public static T? ToEnumSafe<T>(this string s)
where T : struct
{
return (IsEnum<T>(s) ? (T?)Enum.Parse(typeof(T), s) : null);
}
答案 3 :(得分:0)
Enum是没有明显的类型.Net它只是一个具体值类型的占位符(如果你没有另外指定,则为int)。
这意味着您根本无法将其作为类型声明(无论是否采用静态扩展方法)。