【问题标题】:Better Way To Get Char Enum获取字符枚举的更好方法
【发布时间】:2011-12-28 07:19:43
【问题描述】:

有没有更简洁的方法来获取 C# 中枚举的 char 值。

 public enum DivisionStatus
        {
            None = 'N',
            Active = 'A',
            Inactive = 'I',
            Waitlist = 'W'
        }

string status = Enums.DivisionStatus.Active.ToString()[0].ToString(); // "A"

【问题讨论】:

  • OmG... 你在这里问得很好。
  • 您要求一种更清洁 的方法来获取 char 值,但您根本没有获得 char 值。你得到常量名称的第一个字符。如果您将 Active 的 char 值更改为“B”,结果仍将是“A”。

标签: c# enums char


【解决方案1】:

只需转换值:

char status = (char)Enums.DivisionStatus.Active;

请注意,这将使用值而不是标识符。 Enums.DivisionStatus.Active 值是'A' 的字符代码,因为这是您定义的值。

直接使用值比查找值的标识符更快。

【讨论】:

  • 底层类型可以是除char以外的任何整型:msdn.microsoft.com/en-us/library/sbbt4032(v=vs.80).aspx
  • 我想我没有正确解释。如果我想要它有一个字符串作为结束结果而不是一个字符。
  • @MikeFlynn:我明白了,当你要求一个 char 值时,我假设你想要一个 char 值。 ;) 然后只需在末尾添加.ToString(),这是从枚举值创建字符串的最简单方法。
  • 如何将字符串转换为枚举类型。我将枚举值存储在数据库中的字符串中。因此,在存储时,我会执行 ((char)Enums.DivisionStatus.Active).ToString() => 'A'。如何获得“A”=> Enums.DivisionStatusActive。 @Guffa
  • 我自己解决了(Enums.DivisionStatus)Enum.ToObject(typeof(Enums.DivisionStatus), src.AddressDeliverabilityCode[0]
【解决方案2】:

我构建了一个解决问题的“伪枚举”。在您的情况下,它可能看起来像:

public class DivisionStatus
{
    public static readonly DivisionStatus None = new DivisionStatus('N');
    public static readonly DivisionStatus Active = new DivisionStatus('A');
    public static readonly DivisionStatus Inactive = new DivisionStatus('I');
    public static readonly DivisionStatus Waitlist = new DivisionStatus('W');

    internal char Value { get; private set; }

    public override string ToString()
    {
        return Value.ToString();
    }

    protected DivisionStatus(char value)
    {
        this.Value = value;
    }
}

您可以像使用枚举一样使用它,在 ToString() 上返回 char 枚举值而不进行强制转换:

Console.WriteLine(DivisionStatus.None); // returns 'N'

【讨论】:

  • 这不返回'N',DivisionStatus.None.ToString() 返回'N'
【解决方案3】:

您也可以使用静态类。虽然,如果您总是将值用作字符串,那么您可以轻松地将每个属性改为字符串。此方法的一个优点是您可以为将显示在 IntelliSense 中的每个项目添加描述。

public static class DivisionStatus
{
    /// <summary>
    /// Some information about None
    /// </summary>
    public const char None = 'N';
    /// <summary>
    /// Some information about Active, blah blah
    /// </summary>
    public const char Active = 'A';
    /// <summary>
    /// Some information about Inactive, blah blah
    /// </summary>
    public const char Inactive = 'I';
    /// <summary>
    /// Some information about Waitlist, blah blah
    /// </summary>
    public const char Waitlist = 'W';
}

【讨论】:

    【解决方案4】:

    简单的铸造工作,我试过了:

    using System;
    
    public enum DivisionStatus
    {
      None = 'N',
      Active = 'X',
      Inactive = 'I',
      Waitlist = 'W'
    }
    
    class Program
    {
      public static void Main()
      {
        var ds = DivisionStatus.Active;
        Console.WriteLine((char)ds);
      }
    }
    

    【讨论】:

      【解决方案5】:

      var status = (char)Enums.DivisionStatus.Active; 应该做你想做的事。如果枚举文本的第一个字符与底层 char 值不匹配,那么您之前的操作方式将无法正常工作。

      这也适用于以 int 作为支持类型的枚举。

      【讨论】:

      • 枚举确实有一个 int 作为支持类型(因为它是默认值)。定义中使用的 char 值被隐式转换为 int 值。
      【解决方案6】:

      我只会转换枚举值而不调用 ToString:

      var status = (char)DivisionStatus.Active;
      

      或者你可能需要这样做

      var status = (char)(int)DivisionStatus.Active;
      

      【讨论】:

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