如何在 C# 中按值获取枚举对象?

Posted

技术标签:

【中文标题】如何在 C# 中按值获取枚举对象?【英文标题】:How to get Enum object by value in C#? 【发布时间】:2013-05-04 01:45:25 【问题描述】:

我最近遇到一个需要按值获取Enum对象的情况(通过EF CodeFirst保存),这是我的Enum

public enum ShipmentStatus 
  New = 0,
  Shipped = 1,
  Canceled = 2

所以我需要通过值1获取ShipmentStatus.Shipped对象。

那我该怎么做呢?

【问题讨论】:

这是一个很好的问题,尽管之前已经在多个线程上讨论过。 【参考方案1】:

在与 Enum 斗争之后,我创建了这个 - 一个通用的辅助类,它可以满足我的需要 - 通过值获取键,更重要的是 - 从任何 Enum 类型:

public static class EnumHelpers 

  public static T GetEnumObjectByValue<T>(int valueId) 
    return (T) Enum.ToObject(typeof (T), valueId);
  


所以,要获得 Enum 对象ShipmentStatus.Shipped,这将返回这个对象:

var enumObject = EnumHelpers.GetEnumObjectByValue<ShipmentStatus>(1);

所以基本上你可以使用任何 Enum 对象并按值获取它的键:

var enumObject = EnumHelpers.GetEnumObjectByValue<YOUR_ENUM_TYPE>(VALUE);

【讨论】:

您可能需要添加检查以确保该值对Enum 有效。根据Enum.ToObject 的文档,它不会进行该检查。你可以使用Enum.IsDefined 完全正确!否则,转换只是一行代码。【参考方案2】:

为什么不使用这个内置功能?

ShipmentStatus shipped = (ShipmentStatus)System.Enum.GetValues(typeof(ShipmentStatus)).GetValue(1);

【讨论】:

【参考方案3】:

这应该也可以(只需将 int 值转换为 enum 类型):

int _val = 1;
ShipmentStatus _item = (ShipmentStatus)_val;

请注意,如果未定义该枚举,可能会导致错误。

【讨论】:

嗯,没想到这一点。短得多:) 是的,这有点“捷径”:-)

以上是关于如何在 C# 中按值获取枚举对象?的主要内容,如果未能解决你的问题,请参考以下文章

在javascript数组中按值获取索引

如何在PHP中按值对对象数组进行排序

如何在reactjs / javascript中按值对对象数组进行分组

如何使用 Hive 在 Dart 中按值(而不是按索引)读取/更新/删除?

在火花对 RDD 中按值排序

如何在 JavaScript 中按值对地图进行排序?