【问题标题】:How to retrieve an Enum member given its name如何检索给定名称的枚举成员
【发布时间】:2012-01-04 09:12:45
【问题描述】:

很容易我有以下枚举

Public Enum TCheckStatus
        Checked
        NotChecked
        Indeterminate 
    End Enum

我想获取在枚举中找到的给定名称的索引,最好的方法是什么?!!

例如:

假设我有 "NotChecked" 字符串,我希望输出为 1

【问题讨论】:

  • 枚举中的给定名称是什么?
  • 假设我有 "NotChecked" 字符串,我希望输出为 1
  • 你想要索引还是值? (如果枚举已使用显式值声明,它们可能不一样,我想不出任何充分的理由为什么需要索引而不是值。依赖索引而不是值会非常脆弱.)
  • @LukeH 是的,你是对的,最好使用该值,但我错过了解释我的问题的正确词语。

标签: .net vb.net


【解决方案1】:

您正在寻找Enum.GetNames。它检索指定枚举中常量名称的数组。

Dim notCheckedStatus  = DirectCast([Enum].Parse(GetType(TCheckStatus), "NotChecked"), TCheckStatus)
Dim allStatusNames    = [Enum].GetNames(GetType(TCheckStatus))
Dim indexOfNotChecked = Array.IndexOf(AllStatusNames, "NotChecked") '=1'
  1. 行:将string 变量解析为枚举值
  2. 行:将给定枚举类型的所有枚举值返回为Array
  3. 行:返回Array 中给定枚举值的索引

当然要解决你的问题,你只需要这个:

Array.IndexOf([Enum].GetNames(GetType(TCheckStatus)), "NotChecked") 

【讨论】:

  • 感谢您的详细解答。
  • 此答案返回索引,在某些情况下它可能与值不同。例如,从值 1 开始的枚举,或者当某些内容被删除或重新排列时。可以通过以下 vb.net 代码检索该值:CInt(System.Enum.Parse(GetType(TCheckStatus), "NotChecked")).
【解决方案2】:

我无法给出精确的 vb 语法,但我会用 C# 编写它,看看你是否可以使用它:

int index = (int)Enum.Parse( typeof(TCheckStatus), "NotChecked");

index 在这种情况下为 1。如果你给出一个无效的字符串(不是枚举的成员),它会抛出一个异常。如果这不是您想要的,您可以改用Enum.TryParse

如果你已经有了枚举,你可以将它转换为 int 来获取索引:

var myEnum = TCheckStatus.NotChecked;
int index = (int)myEnum;

【讨论】:

  • 请注意,如果枚举已使用显式值声明,则(int)myEnum 将为您提供,不一定是索引。使用索引非常脆弱,而且不是一个好主意,因为开发人员可能会合理地假设成员可以安全地重新排序,只要它们保持其值。
  • 当我说索引时,我的意思是真正的价值,但是很好,你把每个人都说清楚了。
【解决方案3】:

要使用 VB.net 中的 Enum 方法获取名称数组及其整数等价物,请使用 GetNames() 和 GetValues() 方法。使用 Parse() 获取索引。希望这会有所帮助。

【讨论】:

    【解决方案4】:

    试试这个:

    Dim val as integer = cint(DirectCast([Enum].Parse(GetType(TCheckStatus), _
                              "NotChecked"), TCheckStatus)
    

    StackOverflow - Parse a string to an Enum value in VB.NET

    【讨论】:

      【解决方案5】:
      int Output = (int)Enum.Parse(typeof(TCheckStatus), "NotChecked");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多