how to check if string value is in the Enum list?

前端 未结 7 868
深忆病人
深忆病人 2021-01-30 05:15

In my query string, I have an age variable ?age=New_Born.

Is there a way I can check if this string value New_Born is in my Enum list

相关标签:
7条回答
  • 2021-01-30 05:19

    You can use the TryParse method that returns true if it successful:

    Age age;
    
    if(Enum.TryParse<Age>("myString", out age))
    {
       //Here you can use age
    }
    
    0 讨论(0)
  • 2021-01-30 05:20

    I know this is an old thread, but here's a slightly different approach using attributes on the Enumerates and then a helper class to find the enumerate that matches.

    This way you could have multiple mappings on a single enumerate.

    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
    }
    

    With my helper class like this

    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();
        }
    
    }
    

    you can then do something like

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

    And for completeness here is the attribute:

     [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; }
    }
    
    0 讨论(0)
  • 2021-01-30 05:27

    You can use the Enum.TryParse method:

    Age age;
    if (Enum.TryParse<Age>("New_Born", out age))
    {
        // You now have the value in age 
    }
    
    0 讨论(0)
  • 2021-01-30 05:35

    I've got a handy extension method that uses TryParse, as IsDefined is case-sensitive.

    public static bool IsParsable<T>(this string value) where T : struct
    {
        return Enum.TryParse<T>(value, true, out _);
    }
    
    0 讨论(0)
  • 2021-01-30 05:38

    You can use:

     Enum.IsDefined(typeof(Age), youragevariable)
    
    0 讨论(0)
  • 2021-01-30 05:39

    You should use Enum.TryParse to achive your goal

    This is a example:

    [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
    }
    
    0 讨论(0)
提交回复
热议问题