web-dev-qa-db-de.com

Wie überprüfe ich, ob der Zeichenfolgewert in der Aufzählungsliste enthalten ist?

In meiner Abfragezeichenfolge habe ich eine Altersvariable ?age=New_Born.

Gibt es eine Möglichkeit, wie ich überprüfen kann, ob dieser Zeichenfolgenwert New_Born ist in meiner Aufzählungsliste

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

Ich könnte die if-Anweisung jetzt verwenden, aber wenn meine Enum-Liste größer wird. Ich möchte einen besseren Weg finden, dies zu tun. Ich denke darüber nach, Linq zu verwenden, weiß aber nicht, wie ich es machen soll.

80
qinking126

Sie können verwenden:

 Enum.IsDefined(typeof(Age), youragevariable)
135
AaronS

Sie können die Enum.TryParse-Methode verwenden:

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

Sie können die TryParse -Methode verwenden, die bei Erfolg true zurückgibt:

Age age;

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

Ich weiß, dass dies ein alter Thread ist, aber hier ist ein etwas anderer Ansatz, der Attribute in den Aufzählungen und dann eine Hilfsklasse verwendet, um die passende Aufzählung zu finden.

Auf diese Weise können Sie mehrere Zuordnungen in einer einzelnen Aufzählung haben.

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
}

Mit meiner Helferklasse so

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

}

du kannst dann sowas machen

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

Und der Vollständigkeit halber hier das Attribut:

 [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; }
}
1
jwsadler

Ich habe eine praktische Erweiterungsmethode, die TryParse verwendet, da bei IsDefined zwischen Groß- und Kleinschreibung unterschieden wird.

public static bool IsParsable<T>(this string value) where T : struct
{
    return Enum.TryParse<T>(value, true, out _);
}
1
Andy

Um das Alter zu analysieren:

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

Um zu sehen, ob es definiert ist:

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

Abhängig davon, wie Sie das Age -Enum verwenden möchten, ist flags möglicherweise nicht das Richtige. Wie du wahrscheinlich weißt, [Flags] gibt an, dass Sie mehrere Werte zulassen möchten (wie in einer Bitmaske). IsDefined gibt false zurück für Age.Toddler | Age.Preschool weil es mehrere Werte hat.

0
agent-j

Sie sollten Enum.TryParse verwenden, um Ihr Ziel zu erreichen

Dies ist ein Beispiel:

[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