创建将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#中的类型安全泛型解决方案。下面,这很值得一看,并且值得一看。我将删除此编辑,如果解决方案气泡更高的页面。
3 回答
炎炎设计
TA贡献1808条经验 获得超4个赞
Enum
IConvertible
public T GetEnumFromString<T>(string value) where T : struct, IConvertible{ if (!typeof(T).IsEnum) { throw new ArgumentException("T must be an enumerated type"); } //...}
IConvertible
- 3 回答
- 0 关注
- 1531 浏览
添加回答
举报
0/150
提交
取消