Как получить значение 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 } };
}
}
Таким образом, вы можете в любое время вызвать ключ словаря, чтобы получить желаемое значение, и не ошибочно переопределить значение словаря по умолчанию.
Вы можете ссылаться System.Runtime.Serialization
и использовать EnumMember
приписывать.
public enum foonum
{
[EnumMember(Value="success")]
success,
[EnumMember(Value="fail")]
fail
}
Console.WriteLine (foonum.success);
доходность: "успех"