Лучший способ получить Char Enum - PullRequest
18 голосов
/ 14 ноября 2011

Есть ли более чистый способ получить значение типа enum в C #.

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

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

Ответы [ 6 ]

34 голосов
/ 14 ноября 2011

Просто приведите значение:

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

Обратите внимание, что здесь будет использоваться значение вместо идентификатора. Значение Enums.DivisionStatus.Active - это код символа 'A', так как это значение, которое вы определили.

Использование значения напрямую быстрее, чем поиск идентификатора значения.

5 голосов
/ 18 декабря 2013

Я создаю «псевдо-enum», который решает проблему.В вашем случае это может выглядеть так:

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 () без приведения:

Console.WriteLine(DivisionStatus.None); // returns 'N'
2 голосов
/ 23 сентября 2016

Вы также можете использовать статический класс. Хотя, если вы всегда собираетесь использовать значения в качестве строк, вы можете с легкостью вместо этого сделать каждое свойство строкой. Одним из преимуществ этого метода является то, что вы можете добавлять описания для каждого элемента, который будет отображаться в InteliSense.

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';
}
2 голосов
/ 14 ноября 2011

Простое литье работает, я пробовал:

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);
  }
}
1 голос
/ 14 ноября 2011

var status = (char)Enums.DivisionStatus.Active; должен делать именно то, что вы хотите.То, как вы делали это раньше, не сработало бы, если бы первый символ текста перечисления не соответствовал значению основного символа.

Это также работает для перечислений, которые имеют тип int в качестве вспомогательного типа.

0 голосов
/ 14 ноября 2011

Я просто приведу значение enum без вызова ToString:

var status = (char)DivisionStatus.Active;

Или, может быть, вам нужно сделать

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