2017-02-15 11 views
1

У меня есть один типа перечисления, который, имеющие элементы с пространствамиEnum с пространствами .TryParse не работает - C#

 public enum Enum1 
    { 
     [Description("Test1 Enum")] 
     Test1Enum, 
     [Description("Test2 Enum")] 
     Test2Enum, 
     [Description("Test3Enum")] 
     Test3Enum, 
    } 

    public void TestMethod(string testValue) 
    { 
     Enum1 stEnum; 
     Enum.TryParse(testValue, out stEnum); 
     switch (stEnum) 
     { 
      case ScriptQcConditonEnum.Test1Enum: 
       Console.Log("Hi"); 
       break; 
     } 
     } 

Когда я с помощью Enum.TryParse (TestValue, из stEnum), она всегда возвращает первый элемент.

// Currently stEnum returns Test1Enum which is wrong 
    Enum.TryParse("Test2 Enum", out stEnum) 
+1

Что в 'testValue'? Он смотрит на имя значения, а не на описание. Под этим я подразумеваю, что в вашем перечислении нет пробелов. – Brandon

+5

По всей вероятности TryParse возвращает false, что означает, что синтаксический анализ не прошел, а stEnum - значение по умолчанию 0, которое является TestEnum1. Я не уверен, что это за атрибут DescriptionAttribute, но я не думаю, что методы Enum.Parse/TryParse ничего с этим не делают. –

+0

@Brandon testValue - это строка. например: Test1 Enum ..ie то же, что и значение i, помещенное в атрибут [Description] – vmb

ответ

2

Вы можете разобрать Enum из описания Enum, но вам нужно получить значение Enum из описания. Пожалуйста, посмотрите ниже пример, который извлекает значение Enum из описания Enum и анализирует его так, как вы хотите.

значение Enum из описания Enum:

public T GetValueFromDescription<T>(string description) 
    { 
     var type = typeof(T); 
     if (!type.IsEnum) throw new InvalidOperationException(); 
     foreach (var field in type.GetFields()) 
     { 
      var attribute = Attribute.GetCustomAttribute(field, 
       typeof(DescriptionAttribute)) as DescriptionAttribute; 
      if (attribute != null) 
      { 
       if (attribute.Description == description) 
        return (T)field.GetValue(null); 
      } 
      else 
      { 
       if (field.Name == description) 
        return (T)field.GetValue(null); 
      } 
     } 
     throw new ArgumentException("Not found.", "description"); 
     // or return default(T); 
    } 

Пример синтаксического анализа:

Enum.TryParse(GetValueFromDescription<Enum1>("Test2 Enum").ToString(), out stEnum); 
1

Enum.TryParse Trys для разбора строки на основе значения перечислений не доступно. Если ваше требование заключается в анализе на основе описания, вам нужно использовать отражение, чтобы получить значение атрибута. Как это сделать, на этот вопрос уже был дан ответ: Finding an enum value by its Description Attribute

+0

.. Любой другой вариант, кроме размышления, для решения этой проблемы. Или как любой логический подход. – vmb

+0

Это зависит от вашего варианта использования. попробуйте 'Enum.TryParse (testValue.Replace (" ", string.Empty), out stEnum);', но это будет соответствовать только в том случае, если описание совпадает с значением, кроме пробелов, как в вашем примере. –

+0

Помогло ли вам это решить ваша проблема? Вы нашли ответ в другом месте? Пожалуйста, отметьте ответ, который помог или добавил ответ, который вы нашли в другом месте. –