Преобразовать строку в Enum на основе имени enum - PullRequest
4 голосов
/ 21 сентября 2011

Итак, у нас есть настройки перечислений, такие как:

[CorrelatedNumeric(0)]
[Description("USD")]
[SequenceNumber(10)]
USD = 247

В принципе, другая функция может предоставить мне string "USD", но не точное перечисление, потому что его источником является Excel, и мы не можем заставить наших пользователей запоминать значения перечисления;) чувство.

Есть ли способ в c # перейти от "USD" к 247, установив наши перечисления, как они указаны выше?

Ответы [ 3 ]

16 голосов
/ 21 сентября 2011

Будет ли Enum.TryParse() или Enum.Parse() делать то, что вам нужно?

Currency cValue = (Currency) Enum.Parse(typeof(Currency), currencyString); 
4 голосов
/ 21 сентября 2011

Абсолютно - построить Dictionary<string, YourEnumType> по отражению. Просто переберите все поля в перечислении, найдите значения атрибутов и создайте словарь таким образом.

Вы можете видеть, как я сделал нечто подобное в Неограниченная мелодия для атрибута описания, в EnumInternals:

// In the static initializer...
ValueToDescriptionMap = new Dictionary<T, string>();
DescriptionToValueMap = new Dictionary<string, T>();
foreach (T value in Values)
{
    string description = GetDescription(value);
    ValueToDescriptionMap[value] = description;
    if (description != null && !DescriptionToValueMap.ContainsKey(description))
    {
        DescriptionToValueMap[description] = value;
    }
}

private static string GetDescription(T value)
{
    FieldInfo field = typeof(T).GetField(value.ToString());
    return field.GetCustomAttributes(typeof(DescriptionAttribute), false)
                .Cast<DescriptionAttribute>()
                .Select(x => x.Description)
                .FirstOrDefault();
}

Просто сделайте то же самое для своего собственного типа атрибута.

1 голос
/ 21 сентября 2011
 public static object enumValueOf(string description, Type enumType)
 {
      string[] names = Enum.GetNames(enumType);
      foreach (string name in names)
      {
          if (descriptionValueOf((Enum)Enum.Parse(enumType, name)).Equals(description))
           {
               return Enum.Parse(enumType, name);
           }
       }

       throw new ArgumentException("The string is not a description of the specified enum.");
  }

  public static string descriptionValueOf(Enum value)
  {
       FieldInfo fi = value.GetType().GetField(value.ToString());
       DescriptionAttribute[] attributes = (DescriptionAttribute[]) fi.GetCustomAttributes( typeof(DescriptionAttribute), false);
       if (attributes.Length > 0)
       {
             return attributes[0].Description;
       }
       else
       {
            return value.ToString();
       }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...