c# - .NET 3.5 中 Enum.TryParse 的实现

标签 c# .net

如何在 .NET 3.5 中实现 .NET 4 的 Enum.TryParse 方法?

public static bool TryParse<TEnum>(string value, out TEnum result) where TEnum : struct

最佳答案

我不喜欢使用 try-catch 来处理任何转换失败或其他非异常事件作为我应用程序正常流程的一部分,所以我自己的 Enum.TryParse .NET 3.5 及更早版本的方法使用 Enum.IsDefined() 方法来确保 Enum.Parse() 不会抛出异常。您还可以在 value 上包含一些 null 检查,以防止在 value 为 null 时出现 ArgumentNullException

public static bool TryParse<TEnum>(string value, out TEnum result)
    where TEnum : struct, IConvertible
{
    var retValue = value == null ? 
                false : 
                Enum.IsDefined(typeof(TEnum), value);
    result = retValue ?
                (TEnum)Enum.Parse(typeof(TEnum), value) :
                default(TEnum);
    return retValue;
}

显然,此方法不会驻留在 Enum 类中,因此您需要一个合适的类来包含此方法。

一个限制是缺少对泛型方法的 enum 约束,因此您必须考虑要如何处理不正确的类型。如果 TEnum 不是 enumEnum.IsDefined 将抛出 ArgumentException 但唯一的其他选项是运行时检查并抛出一个不同的异常,所以我通常不添加额外的检查,只是让这些方法中的类型检查为我处理。我会考虑添加 IConvertible 作为另一个约束,只是为了帮助进一步约束类型。

关于c# - .NET 3.5 中 Enum.TryParse 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15017151/

相关文章:

C# ‘dynamic’ 无法访问在另一个程序集中声明的匿名类型的属性

c# - WPF TextBox 移动光标和改变焦点

c# - 在 C# 中使用身份验证复制文件

c# - 检索 Windows Mobile 浏览器历史记录

c# - 使用 Graphics.DrawString 时动态调整字体大小以适应空间

c# - .net 中的数据访问层

c# .net 更改标签文本

c# - C++ 中的嵌入式 Mono 启动 C# ServiceBase

c# - 为什么在此实现中插入排序总是击败合并排序?

c# - Monodroid 隐藏和显示状态栏