Laden...

Enum zur Laufzeit erzeugen?

Letzter Beitrag vor 14 Jahren 7 Posts 4.816 Views
Enum zur Laufzeit erzeugen?

Hi!

Ich habe folgenden Fall:
Im GUI gibt es ein paar Listen die auf Enums basieren.
Diese Enums haben eine Textrepresentation die in einem Resx liegt.
Deshalb bin ich dabei einen Konverter zu schreiben der mit Enums und diese Strings übersetzt, in beide Richtungen. Enum zu Text ist nicht schwer und funktioniert auch schon wunderbar. Probleme hab ich jetzt dabei, mir aus dem Text ein Enum zu erstellen...

        public static T ConvertStringToEnum<T>(string stringRepresentation)
        {
            Type enumType = typeof(T);

            T ret;

            if (!enumType.IsEnum)
            {
                throw new ArgumentException("Type '" + enumType.FullName + "' is not an enum");
            }

            var resFields = Resources.Enums.ResourceManager.GetType().GetFields().Where(field => field.Name.StartsWith(enumType.Name));

            foreach (var resField in resFields)
            {
                string resString = Resources.Enums.ResourceManager.GetString(resField.Name);
                if (resString == stringRepresentation)
                {
// TODO: Enum-Wert zurück geben.                    
                }
            }

            throw new ArgumentException("No value in the given enum " + enumType.FullName + " has the representatin " + stringRepresentation);
        }

Wie ihr seht will ich nicht einfach nur dumme Konverter die im Switch durchgehen für jedes einzelne Enum sonder das ganze möglichst generisch...

Jedenfalls komme ich jetzt beim TODO nicht weiter... wie erstelle ich mir, wenn ich das Enumfeld kenne jetzt das entsprechende "Objekt" ???

LG & danke für jede Hilfe!!!
Dominik

edit:
Im resx liegen die string-Representationen unter den Keys "[EnumName]_[EnumWert]". Dh im resFields stehen alle Felder die zum enum T gehören.

Nichts für ungut aber wozu soll das denn gut sein? ich meine, die Werte, die nur in der GUI angezeigt werden, sind ohnehin nur einbahnstraße (Enum übersetzen und raus damit) und die Werte, die in der GUI z.b. auswählbar sein sollen haben eh eine Koppelung (ValueMember und DisplayMember). So und nicht anders wird das gehandhabt.

Ich geb zwar JAck30lena uneingeschränkt Recht, aber es gibt tatsächlich eine Methode, die soetwas macht: Enum.TryParse

Weeks of programming can save you hours of planning

Jain. Diese Methode funktioniert nur, wenn du exakt den selben String hast, wie der Enumwert auch besitzt und wenn du weißt, welche Enums betroffen sein können. Hast du aber in der resource datei sowas:
Key1 = EnumWert
Value1 = "Ein übersetzter Text X"
Key2 = EtwasVölligAnderes
Value2 = "Ein übersetzter Text X"

Dann hast du ein großes Problem und die Wahrscheinlichkeit eines solchen Konfliktes ist hoch.

Oder anders:

enum X 
{
Anton
Gustav
}

enum Y
{
Berta
Gustav
}

--> und welches ist nun gemeint wenn man nur "Gustav" hat?

@MrSparkle: Leider bin ich auf WP7 unterwegs und da gibt es die nicht =(

@JAck30lena: WP7 mit Silverlight(WPF) Databinding... Ich hab im VM eine Liste von Strings die ans Dropdown hänge... Dh im Setter von meinem Property das am SelectedItem des Controls hängt, bekomm ich nur einen String.
Wenn du sagt, dass es vom Design her schlecht ist glaub ich dir gerne... wie würdest du es machen?

LG

edit: TryParse wäre genau was ich brauche... ich kennen exacten value da ich im resx die keys mit [EnumName]_[EnumWert] anlege und nur durch die resx values durchsuche die zu dem passenden enum gehören.

*beim lesen*

Danke schon mal!