问题描述:
目标是创建一个泛型函数,扩展 Enum.Parse
的功能,允许在找不到匹配的枚举值时指定默认值。该函数也应该不区分大小写。
然而,当尝试使用以下代码定义函数时:
public static T GetEnumFromString<T>(string value, T defaultValue) where T : Enum { // 实现... }
会遇到一个错误,指出约束不能是特殊类(System.Enum)。
解决方案:
为了解决此错误并允许使用泛型枚举,可以将约束修改为:
public static T GetEnumFromString<T>(string value, T defaultValue) where T : struct, IConvertible
此更新后的约束确保 T 是一个结构体,并且也支持 IConvertible 接口,该接口由枚举实现。
改进后的实现:
以下修改后的代码演示了改进后的实现:
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().ToLowerInvariant().Equals(value.Trim().ToLowerInvariant())) { return item; } } return defaultValue; } }
此方法现在接受泛型枚举类型,并且是完全类型安全的,确保只返回有效的枚举值。 ToLowerInvariant()
的使用保证了跨文化的正确性。
以上是如何在C#中安全解析具有默认值的枚举字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!