634 Stimmen

Assoziieren von Enums mit Strings in C#

Ich weiß, dass das Folgende nicht möglich ist, weil der Typ der Aufzählung ein int sein muss

enum GroupTypes
{
    TheGroup = "OEM",
    TheOtherGroup = "CMB"
}

In meiner Datenbank erhalte ich ein Feld mit unverständlichen Codes (die OEM y CMB s). Ich möchte dieses Feld zu einem enum oder etwas anderes Verständliches. Denn wenn das Ziel die Lesbarkeit ist, sollte die Lösung prägnant sein.

Welche anderen Möglichkeiten habe ich?

1 Stimmen

Mögliche Duplikate von Enum ToString

24 Stimmen

Ich bin mir nicht sicher, warum die meisten Antworten nicht einfach "const string" verwenden und stattdessen eigene Klassen erstellen.

2 Stimmen

Sie können zwar keine Zeichenketten verwenden, aber Sie können sehr wohl Zeichenketten verwenden. Das ist eine Option, wenn Sie Werte mit nur einem Buchstaben verwenden können.

11voto

azamsharp Punkte 18941

Hier ist die Erweiterungsmethode, die ich verwendet habe, um den Enum-Wert als String zu erhalten. Zuerst ist hier die Aufzählung.

public enum DatabaseEnvironment
{
    [Description("AzamSharpBlogDevDatabase")]
    Development = 1, 
    [Description("AzamSharpBlogQADatabase")]
    QualityAssurance = 2, 
    [Description("AzamSharpBlogTestDatabase")] 
    Test = 3
}

Das Attribut Beschreibung stammt aus System.ComponentModel.

Und hier ist meine Erweiterungsmethode:

public static string GetValueAsString(this DatabaseEnvironment environment) 
{
    // get the field 
    var field = environment.GetType().GetField(environment.ToString());
    var customAttributes = field.GetCustomAttributes(typeof (DescriptionAttribute), false);

    if(customAttributes.Length > 0)
    {
        return (customAttributes[0] as DescriptionAttribute).Description;  
    }
    else
    {
        return environment.ToString(); 
    }
}

Jetzt können Sie mit dem folgenden Code auf die Aufzählung als String-Wert zugreifen:

[TestFixture]
public class when_getting_value_of_enum
{
    [Test]
    public void should_get_the_value_as_string()
    {
        Assert.AreEqual("AzamSharpBlogTestDatabase",DatabaseEnvironment.Test.GetValueAsString());  
    }
}

10voto

user3180664 Punkte 177

Neu in .Net Core 3.0/C# 8.0 (falls Ihre Arbeitsumgebung ein Upgrade Ihres Projekts zulässt) ist eine kurze Switch-Anweisung, die ein wenig wie eine Aufzählung aussieht. Letzten Endes ist es die gleiche alte, langweilige Switch-Anweisung, die wir seit Jahren verwenden.

Der einzige wirkliche Unterschied besteht darin, dass die Switch-Anweisung einen neuen Anzug bekommen hat.

public static RGBColor FromRainbow(Rainbow colorBand) =>
colorBand switch
{
    Rainbow.Red    => new RGBColor(0xFF, 0x00, 0x00),
    Rainbow.Orange => new RGBColor(0xFF, 0x7F, 0x00),
    Rainbow.Yellow => new RGBColor(0xFF, 0xFF, 0x00),
    Rainbow.Green  => new RGBColor(0x00, 0xFF, 0x00),
    Rainbow.Blue   => new RGBColor(0x00, 0x00, 0xFF),
    Rainbow.Indigo => new RGBColor(0x4B, 0x00, 0x82),
    Rainbow.Violet => new RGBColor(0x94, 0x00, 0xD3),
    _              => throw new ArgumentException(message: "invalid enum value", paramName: nameof(colorBand)),
};

Sie werden feststellen, dass der obige Code, den ich aus aquí ist die Verwendung einer Aufzählung als Parameter.

Es ist nicht genau das, was Sie wollen (und glauben Sie mir, ich wollte schon lange etwas Ähnliches wie die Anfrage des Auftraggebers), aber ich habe tatsächlich das Gefühl, dass dies eine Art Olivenzweig von MS ist. JMO.

Hoffentlich hilft es jemandem!

9voto

moldypenguins Punkte 410

Übernommen von @EvenMien und in einigen Kommentaren ergänzt. (Auch für meinen eigenen Anwendungsfall)

public struct AgentAction
{
    private AgentAction(string value) { Value = value; }

    public string Value { get; private set; }

    public override string ToString() { return this.Value; }

    public static AgentAction Login = new AgentAction("Login");
    public static AgentAction Logout = new AgentAction("Logout");

    public static implicit operator string(AgentAction action) { return action.ToString(); }
}

6voto

Warum nicht einfach dieselbe Aufzählung verwenden, aber nur den Aufruf .ToString() ?

using System;

public class EnumSample
{
    enum Holidays
    {
        Christmas = 1,
        Easter = 2
    };

    public static void Main()
    {
        Enum myHolidays = Holidays.Christmas;
        Console.WriteLine("The value of this instance is '{0}'", myHolidays.ToString());
    }
}

6voto

Jim Mischel Punkte 125706

Haben Sie eine Nachschlagetabelle mit einem Dictionary in Betracht gezogen?

enum GroupTypes
{
    TheGroup,
    TheOtherGroup
}

Dictionary<string, GroupTypes> GroupTypeLookup = new Dictionary<string, GroupTypes>();
// initialize lookup table:
GroupTypeLookup.Add("OEM", TheGroup);
GroupTypeLookup.Add("CMB", TheOtherGroup);

Sie können dann GroupTypeLookup.TryGetValue() verwenden, um eine Zeichenkette nachzuschlagen, wenn Sie sie lesen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X