如何检查string值是否在枚举列表中?

在我的查询string中,我有一个年龄variables?age=New_Born

有没有一种方法可以检查这个string值New_Born是否在我的枚举列表中

 [Flags] public enum Age { New_Born = 1, Toddler = 2, Preschool = 4, Kindergarten = 8 } 

我现在可以使用if语句,但是如果我的Enum列表变大了。 我想find一个更好的方法来做到这一点。 我正在考虑使用Linq,只是不知道该怎么做。

您可以使用:

  Enum.IsDefined(typeof(Age), youragevariable) 

您可以使用Enum.TryParse方法:

 Age age; if (Enum.TryParse<Age>("New_Born", out age)) { // You now have the value in age } 

如果成功,您可以使用TryParse方法返回true。

 Age age; if(Enum.TryParse<Age>("myString", out age)) { //Here you can use age } 

你应该使用Enum.TryParse来实现你的目标

这是一个例子:

 [Flags] private enum TestEnum { Value1 = 1, Value2 = 2 } static void Main(string[] args) { var enumName = "Value1"; TestEnum enumValue; if (!TestEnum.TryParse(enumName, out enumValue)) { throw new Exception("Wrong enum value"); } // enumValue contains parsed value } 

parsing年龄:

 Age age; if (Enum.TryParse(typeof(Age), "New_Born", out age)) MessageBox.Show("Defined"); // Defined for "New_Born, 1, 4 , 8, 12" 

要看它是否被定义:

 if (Enum.IsDefined(typeof(Age), "New_Born")) MessageBox.Show("Defined"); 

根据你计划如何使用Age枚举, 标志可能不是正确的事情。 正如你可能知道的那样, [Flags]表示你想允许多个值(如位掩码)。 对于Age.Toddler | Age.Preschool IsDefined将返回false Age.Toddler | Age.Preschool因为它有多个值。

我知道这是一个旧的线程,但这里有一个稍微不同的方法,使用枚举的属性,然后辅助类来查找匹配的枚举。

这样你就可以有一个枚举多个映射。

 public enum Age { [Metadata("Value", "New_Born")] [Metadata("Value", "NewBorn")] New_Born = 1, [Metadata("Value", "Toddler")] Toddler = 2, [Metadata("Value", "Preschool")] Preschool = 4, [Metadata("Value", "Kindergarten")] Kindergarten = 8 } 

像我这样的帮手类

 public static class MetadataHelper { public static string GetFirstValueFromMetaDataAttribute<T>(this T value, string metaDataDescription) { return GetValueFromMetaDataAttribute(value, metaDataDescription).FirstOrDefault(); } private static IEnumerable<string> GetValueFromMetaDataAttribute<T>(T value, string metaDataDescription) { var attribs = value.GetType().GetField(value.ToString()).GetCustomAttributes(typeof (MetadataAttribute), true); return attribs.Any() ? (from p in (MetadataAttribute[]) attribs where p.Description.ToLower() == metaDataDescription.ToLower() select p.MetaData).ToList() : new List<string>(); } public static List<T> GetEnumeratesByMetaData<T>(string metadataDescription, string value) { return typeof (T).GetEnumValues().Cast<T>().Where( enumerate => GetValueFromMetaDataAttribute(enumerate, metadataDescription).Any( p => p.ToLower() == value.ToLower())).ToList(); } public static List<T> GetNotEnumeratesByMetaData<T>(string metadataDescription, string value) { return typeof (T).GetEnumValues().Cast<T>().Where( enumerate => GetValueFromMetaDataAttribute(enumerate, metadataDescription).All( p => p.ToLower() != value.ToLower())).ToList(); } } 

然后你可以做类似的事情

 var enumerates = MetadataHelper.GetEnumeratesByMetaData<Age>("Value", "New_Born"); 

为了完整,这里是属性:

  [AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = true)] public class MetadataAttribute : Attribute { public MetadataAttribute(string description, string metaData = "") { Description = description; MetaData = metaData; } public string Description { get; set; } public string MetaData { get; set; } }