Как получить значение Enums в виде строки в C#

У меня есть следующее перечисление:

public enum DocumentState
{
    Default = 0,
    Draft = 1,
    Archived = 2,
    Deleted = 3
}

В большинстве мест в моем решении я использую его как обычное перечисление. Некоторые места, которые я использую в int, приводят это так:

(int)DocumentState.Default)

Но затем, в некоторых местах, например, когда я работаю с Examine (который принимает в качестве входных данных только строки, а не int-ы), мне нужно передать значение enumns int, как если бы оно было строкой. Это можно сделать следующим образом:

((int)DocumentState.Default).ToString()

Мой вопрос сейчас; может ли быть правдой, что нет другого способа получить значение перечисления в виде строки?

Я знаю, что могу злоупотреблять Enum, но иногда это лучший подход в данном случае.

5 ответов

Решение

Использование DocumentState.Default.ToString("d"), См. https://msdn.microsoft.com/en-us/library/a0h36syw(v=vs.110).aspx

Кажется, вы злоупотребляете перечислениями. Если вам нужно хранить дополнительную информацию, используйте реальные классы. В этом случае ваш Document-класс может иметь Stateсвойство, которое возвращает экземпляр DocumentState класс, который имеет свойство для DocStateType-enum. Затем вы можете добавить дополнительную информацию, такую ​​как TypeId при необходимости и код для получения строки очень прост и читабелен:

public class Document
{
    public int DocumentId { get; set; }
    public DocumentState State { get; set; }
    // other properties ...
}


public enum DocStateType
{
    Default = 0,
    Draft = 1,
    Archived = 2,
    Deleted = 3
}

public class DocumentState
{
    public DocumentState(DocStateType type)
    {
        this.Type = type;
        this.TypeId = (int) type;
    }
    public DocumentState(int typeId)
    {
        if (Enum.IsDefined(typeof (DocStateType), typeId))
            this.Type = (DocStateType) typeId;
        else
            throw new ArgumentException("Illegal DocStateType-ID: " + typeId, "typeId");
        this.TypeId = typeId;
    }

    public int TypeId { get; set; }
    public DocStateType Type { get; set; }
    // other properties ...
}

Если вы хотите TypeId как строка вам просто нужно doc.State.TypeId.ToString()Fe:

Document doc = new Document();
doc.State = new DocumentState(DocStateType.Default);
string docTypeId = doc.State.TypeId.ToString();

Этот подход использует значение enum как TypeIdобычно вы не используете значение enum для вашей бизнес-логики. Поэтому они должны быть независимыми.

Лично я думаю, что вы пытаетесь сделать с вашим Enum не лучший подход. Что вы можете сделать, это создать класс, который имеет Dictionary<TKey, TValue> держать ваши ключи и ценности.

В C# 6 или позже:

static class DocumentState {
    public static Dictionary<string, int> States { get; } = new Dictionary<string, int>() { { "Default", 0 }, { "Draft", 1 }, { "Archived", 2 }, { "Deleted", 3 } };
}

C# 5 или ниже:

class DocumentState {
    public Dictionary<string, int> State { get; }

    public DocumentState() {
        State = new Dictionary<string, int>() { { "Default", 0 }, { "Draft", 1 }, { "Archived", 2 }, { "Deleted", 3 } };
    }
}

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

Вы можете использовать метод Enum.GetName

Вы можете ссылаться System.Runtime.Serialization и использовать EnumMember приписывать.

public enum foonum
{
    [EnumMember(Value="success")]
    success,
    [EnumMember(Value="fail")]
    fail
}

Console.WriteLine (foonum.success);

доходность: "успех"

Другие вопросы по тегам