【问题标题】:Enum String Name from Value来自值的枚举字符串名称
【发布时间】:2010-09-23 11:40:06
【问题描述】:

我有一个这样的枚举结构:

public enum EnumDisplayStatus
{
    None    = 1,
    Visible = 2,
    Hidden  = 3,
    MarkedForDeletion = 4
}

在我的数据库中,枚举是按值引用的。我的问题是,如何将枚举的数字表示转回字符串名称。

例如,给定2,结果应该是Visible。

【问题讨论】:

  • 我相信,现在使用 VS 2015 nameof(EnumDisplayStatus.Visible) 可以更轻松地做到这一点,希望对某人有所帮助
  • @Gabriel:但是!这将返回传入的变量或对象的编译时名称。所以....var x = MyEnum.Visible; nameof(x) 将产生"x",而不是"Visible"。

标签: c# enums


【解决方案1】:

您可以通过简单的转换将int 转换回枚举成员,然后调用ToString():

int value = GetValueFromDb();
var enumDisplayStatus = (EnumDisplayStatus)value;
string stringValue = enumDisplayStatus.ToString();

【讨论】:

【解决方案2】:

如果你需要得到一个字符串 "Visible" 而没有得到 EnumDisplayStatus 实例,你可以这样做:

int dbValue = GetDBValue();
string stringValue = Enum.GetName(typeof(EnumDisplayStatus), dbValue);

【讨论】:

  • 如果您对 Mandoleen 的回答有误:Enum.GetName 返回一个字符串,而不是 Enum
【解决方案3】:

试试这个:

string m = Enum.GetName(typeof(MyEnumClass), value);

【讨论】:

  • @nilco 这个答案很好,但我更喜欢 Kents 的答案,主要是因为我的枚举“描述”上有一个自定义属性,然后我有一个枚举扩展来获取描述 - 这是为了显示在屏幕上为用户显示。
【解决方案4】:

使用这个:

string bob = nameof(EnumDisplayStatus.Visible);

【讨论】:

  • 需要 C# 6+。
  • @AZChad 知道这是件好事,当然;但它真正不适用于 OP 的场景,因为值来自数据库(因此:运行时,而不是编译时,值)
【解决方案5】:

使用nameof expression 的最快编译时间解决方案。

返回枚举的文字类型大小写,或者在其他情况下,class、struct 或variable 的任何类型(arg、param、local 等)。

public enum MyEnum {
    CSV,
    Excel
}


string enumAsString = nameof(MyEnum.CSV)
// enumAsString = "CSV"

注意:

  • 您不希望将枚举命名为全大写,但用于证明 nameof 的大小写敏感性。

【讨论】:

  • 这应该是一个答案。
  • @LinPyfan 很高兴它运作良好!与 OP 日期相比,这是一个相对较新的日期。
【解决方案6】:

你可以投射它

int dbValue = 2;
EnumDisplayStatus enumValue = (EnumDisplayStatus)dbValue;
string stringName = enumValue.ToString(); //Visible

啊..肯特打败了我:)

【讨论】:

    【解决方案7】:

    解决方案:

    int enumValue = 2; // The value for which you want to get string 
    string enumName = Enum.GetName(typeof(EnumDisplayStatus), enumValue);
    

    此外,使用 GetName 优于 Enum 的显式转换。

    [性能基准代码]

    Stopwatch sw = new Stopwatch (); sw.Start (); sw.Stop (); sw.Reset ();
    double sum = 0;
    int n = 1000;
    Console.WriteLine ("\nGetName method way:");
    for (int i = 0; i < n; i++) {
       sw.Start ();
       string t = Enum.GetName (typeof (Roles), roleValue);
       sw.Stop ();
       sum += sw.Elapsed.TotalMilliseconds;
       sw.Reset ();
    }
    Console.WriteLine ($"Average of {n} runs using Getname method casting way: {sum / n}");
    Console.WriteLine ("\nExplicit casting way:");
    for (int i = 0; i < n; i++) {
       sw.Start ();
       string t = ((Roles)roleValue).ToString ();
       sw.Stop ();
       sum += sw.Elapsed.TotalMilliseconds;
       sw.Reset ();
    }
    Console.WriteLine ($"Average of {n} runs using Explicit casting way: {sum / n}");
    

    [示例结果]

    GetName method way:
    Average of 1000 runs using Getname method casting way: 0.000186899999999998
    Explicit casting way:
    Average of 1000 runs using Explicit casting way: 0.000627900000000002
    

    【讨论】:

    • 这是一个 7 岁答案的副本。你能解释一下为什么你的比原来的更好吗?
    • @nvoigt 因为,如果我是正确的,Enum 上的 ToString() API 现在已经过时了。 [docs.microsoft.com/en-us/dotnet/api/…
    • 所以...至少有两个其他答案已经提供了您发布的代码。与 Mandoleen 或 algreat 的相比,您提供了什么?
    • @nvoigt 他们没有提到它与显式转换相比的性能。这足以让你喜欢我的回答吗? :p 无论如何,谢谢,我希望它会对某人有所帮助。 :)
    • 我们似乎有沟通问题。您是在移动设备上还是向下滚动的距离不够远? 7年前你的答案有两份准确的副本。我命名了回答者,所以他们应该很容易找到。您的回答提供了至少 7 年没有出现的情况?
    【解决方案8】:

    数据库到 C#

    EnumDisplayStatus status = (EnumDisplayStatus)int.Parse(GetValueFromDb());
    

    C# 到数据库

    string dbStatus = ((int)status).ToString();
    

    【讨论】:

      【解决方案9】:

      只需要:

      string stringName = EnumDisplayStatus.Visible.ToString("f");
      // stringName == "Visible"
      

      【讨论】:

      • 在大多数情况下,这与 10 年前的最佳答案几乎相同; "f" 说明符的添加是细微的,可能是也可能不是调用者想要的(这取决于:他们想要什么):docs.microsoft.com/en-us/dotnet/standard/base-types/…
      • 我没注意日期啊啊啊。我认为更新一点像这样的旧解决方案是件好事。我不会是最后一个打开此页面的人。感谢您的精确! :)
      【解决方案10】:

      获取字符串值[Name]:

      EnumDisplayStatus enumDisplayStatus = (EnumDisplayStatus)GetDBValue();
      string stringValue = $"{enumDisplayStatus:G}"; 
      

      以及获取枚举值:

      string stringValue = $"{enumDisplayStatus:D}";
      SetDBValue(Convert.ToInt32(stringValue ));
      

      【讨论】:

      • 为什么不只是 .ToString()? 'facepalm'
      【解决方案11】:

      我已经使用了下面给出的代码

       CustomerType = ((EnumCustomerType)(cus.CustomerType)).ToString()
      

      【讨论】:

        【解决方案12】:

        只需将 int 转换为枚举类型:

        EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
        string statusString = status.ToString();
        

        【讨论】:

          【解决方案13】:

          你可以试试这个

          string stringValue=( (MyEnum)(MyEnum.CSV)).ToString();
          

          【讨论】:

          • 演员表是多余的
          【解决方案14】:

          给定:

          enum Colors {
              Red = 1,
              Green = 2,
              Blue = 3
          };
          

          在 .NET 4.7 中

          Console.WriteLine( Enum.GetName( typeof(Colors), Colors.Green ) );
          Console.WriteLine( Enum.GetName( typeof(Colors), 3 ) );
          

          会显示

          Green
          Blue
          

          在 .NET 6 中,上述方法仍然有效,但是:

          Console.WriteLine( Enum.GetName( Colors.Green ) );
          Console.WriteLine( Enum.GetName( (Colors)3 ) );
          

          将显示:

          Green
          Blue
          

          【讨论】:

            猜你喜欢
            • 2019-07-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-18
            • 2011-10-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多