2016-08-30 129 views
2

我正在开发Windows应用商店应用,我有这样的代码。Enum.Parse带注释

public enum Categories 
{ 
    Cat1, 
    Cat2, 
    Cat3 
} 

是否有任何选项string[] cats = {"categoty 1", "category 2", "category 3"}转换为Enum

我使用EnumMember属性的尝试:

[DataContract] 
public enum Categories 
{ 
    [EnumMember(Value = "category 1")] 
    Cat1, 

    [EnumMember(Value = "category 2")] 
    Cat2, 

    [EnumMember(Value = "category 3")] 
    Cat3 
} 

...但仍然没有运气var cat = Enum.Parse(typeof(Categories), cats[0]);

Exception thrown: 'System.ArgumentException' in mscorlib.ni.dll 
Requested value 'category 1' was not found. 

任何想法?

+1

与属性的方法,你需要使用反射来得到所有的枚举值的属性和比较,您的字符串。一个简单的方法(虽然可以说稍微不太容易维护)只包括一个将字符串映射到枚举值的“Dictionary ”。 –

+1

这个问题的答案可能会给你带来一些启示http://stackoverflow.com/questions/19767863/cant-get-enum-to-convert-to-json-properly-using-json-net –

回答

1
private static T GetValueFromEnumMember<T>(string value) 
{ 
    var type = typeof(T); 
    if (type.GetTypeInfo().IsEnum) 
    { 
     foreach (var name in Enum.GetNames(type)) 
     { 
      var attr = type.GetRuntimeField(name).GetCustomAttribute<EnumMemberAttribute>(true); 
      if (attr != null && attr.Value == value) 
       return (T)Enum.Parse(type, name); 
     } 

     return default(T); 
    } 

    throw new InvalidOperationException("Not Enum"); 
} 

用法:

var cat = GetValueFromEnumMember<Categories>(cats[0]); 
+0

请添加一些解释为什么这段代码有助于OP。这将有助于提供未来观众可以从中学习的答案。有关更多信息,请参阅[答案]。 –