Laden...

Wie übergebe ich ein Enum an eine Funktion?

Erstellt von andi_bln vor 7 Jahren Letzter Beitrag vor 7 Jahren 4.584 Views
A
andi_bln Themenstarter:in
25 Beiträge seit 2014
vor 7 Jahren
Wie übergebe ich ein Enum an eine Funktion?

Guten Morgen,

leider komme ich nicht weiter. Ich möchte an eine Funktion ein Enum uebergeben, in dieser soll daraus ein bestimmter String aus der Description und dem Wert + Namen berechnet werden.
Nun muss ich das Enum ganz normal durchenumerieren oder mit LINQ auswerten. Ich scheitere mit dem Enum in der Funktion.
Mit MyVals kome ich auch nicht weiter ....

z.B. foreach (Enum dsp in Enum.GetValues(typeof(MyEnum)))

Kann da jemand helfen ?

Andreas


 public enum DISP
        {
            [Description("TEXT1")]
            WT1 = 0,
            [Description("TEXT2")]
            WT2,
            [Description("TEXT3")]
            WT3,
         }   



public void Test1()
        {
          string tt=   = MTest(new DISP());
             
        }

        public static string MTest(Enum MyEnum)
        {
            string test;
            var MyVals = Enum.GetValues(MyEnum.GetType());
            /*
            foreach (Enum dsp in Enum.GetValues(typeof(MyEnum)))

            { 
            
            
            }
            */
            return string.Empty;
        }

noch ?????

2.078 Beiträge seit 2012
vor 7 Jahren

Nutz doch bitte die C#-Tags, das macht den Code gleich viel besser lesbar.

Und ein Enum instanziierst Du nicht, Du nutzt es so:

string tt = MTest(DISP.WT1);

Die ForEach-Schleife sieht aber richtig aus.

Und wie Du an das Attribut am Feld kommst, wird hier erklärt:
Getting attributes of Enum's value

Hinweis von gfoidl vor 7 Jahren

Und du setzt bitte die Links entsprechend [Hinweis] Wie poste ich richtig? Punkt 3.1 😉

Die Code-Tags hab ich eingefügt (oben).

3.003 Beiträge seit 2006
vor 7 Jahren

Danke der fehlenden Formatierung und der irreführenden Großschreibung hat Palladin007 das hier noch übersehen:


foreach (Enum dsp in Enum.GetValues(typeof(MyEnum)))
{
}

typeof erwartet einen Klassennamen, MyEnum ist aber eine lokale Variable. Wenn du aber schon einen genauen Wert hast (MyEnum), brauchst du auch keine Schleife, in der du alle möglichen Werte der Enumeration durchgehst.


foreach(DISP enumValue in Enum.GetValues(typeof(DISP)))
{
   //...Attribut extrahieren, siehe Link von Palladin
}
//...oder:
DISP myEnum = DISP.WT1;
var attribute = typeof(DISP)
    .GetMember(myEnum.ToString())
    .First()
    .GetCustomAttributes(typeof(MyCustomAttribute))
    .First() as MyCustomAttribute;
//usw.

LaTino
EDIT: Format

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

A
andi_bln Themenstarter:in
25 Beiträge seit 2014
vor 7 Jahren

Naja, das Ziel ist es, ein komplettes Enum zu übergeben, dieses in einer Funktion auseinander zunehmen und aus den Werten ( Description, Values , Name ) einen speziellen String zusammen zu bauen.
Das Enum direkt zu bearbeiten, ist kein Problem aber das würde zu verzigfachen Vergrößerung des Codes führen...
Die Übergabe des jeweiligen Enums als Parameter in eine Funktion ist problemlos möglich, die Names auszulesen ebenfalls, komme aber (noch) nicht an die Descriptions ran ...

Andreas

noch ?????

3.003 Beiträge seit 2006
vor 7 Jahren

Du verwirrst mich. Was ist ein "komplettes Enum"? Möchtest du aus allen deklarierten Membern der Enumeration einen einzigen String basteln?


public MyDescriptionAttribute : Attribute
{
    public string Description { get; set; }
}

private static string GetDescriptionValue(MemberInfo member)
{
    var customAttribute = GetCustomAttributes(typeof(MyDescriptionAttribute)).FirstOrDefault();
    return customAttribute == null ? null : ((MyDescriptionAttribute)customAttribute).Description;
}

static IEnumerable<string> GetDescriptions(Type enumType)
{
    if(!enumType.IsEnum) throw new InvalidOperationException();

    return Enum.GetNames(enumType).SelectMany(p => enumType.GetMember(p)).Select(GetDescriptionValue).Where(p => p != null);
}

//Anwendung:
string[] descriptions = GetDescriptions(typeof(DISP)).ToArray();

LaTino
(keine Gewähr, im Forumeditor getippt, aber das Prinzip sollte klar sein)

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

A
andi_bln Themenstarter:in
25 Beiträge seit 2014
vor 7 Jahren

ja genau aus allen Member einen String basteln ...
Das übergebene Enum last sich einfach nicht in der Funktion bearbeiten..
Am besten 2 Listen Names und Descriptions ..

Habe einen totalen Blackout ..

Andreas

noch ?????

T
708 Beiträge seit 2008
vor 7 Jahren

Gehe ich Recht in der Annahme dass Du das hier erreichen möchtest?

        public static List<string> EnumToList(Enum enumeration)
        {
            //get the enumeration type
            var et = enumeration.GetType();

            //get the public static fields (members of the enum)
            var fi = et.GetFields(BindingFlags.Static | BindingFlags.Public);

            //create a new enum array
            var values = new List<string>();

            //populate with the values
            for (var iEnum = 0; iEnum < fi.Length; iEnum++)
            {
                values.Add(fi[iEnum].GetValue(enumeration).ToString());
            }

            return values;
        }

Der Aufruf geht dann genau so wie Du es möchtest mit EnumToList(new DISP()).

Um das Ergebnis z.B. einer DataSource einer Combobox zu hinterlegen, kann man das wie folgt machen:

        public static Enum[] EnumToArray(Enum enumeration)
        {
            //get the enumeration type
            var et = enumeration.GetType();

            //get the public static fields (members of the enum)
            var fi = et.GetFields(BindingFlags.Static | BindingFlags.Public);

            //create a new enum array
            var values = new Enum[fi.Length];

            //populate with the values
            for (var iEnum = 0; iEnum < fi.Length; iEnum++)
            {
                values[iEnum] = (Enum)fi[iEnum].GetValue(enumeration);
            }
            
            return values;
        }

Und so aufrufen:

cbMsgLogType.DataSource = Converter.EnumToArray(_setup.MessageLogType);

Hat den Vorteil, dass man den Wert direkt zurück casten kann.

A
andi_bln Themenstarter:in
25 Beiträge seit 2014
vor 7 Jahren

Genau das war es!!

Die ein schönes WE..

Viele Grüße
aus Berlin

Andreas

noch ?????

3.003 Beiträge seit 2006
vor 7 Jahren

@trib: Du hast da zwei Methoden, die Enum.GetNames und Enum.GetValues abbilden oO


string[] names = Enum.GetNames(typeof(DISP));
cbMsgLogType.DataSource = Enum.GetValues(typeof(DISP));

😉

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

T
708 Beiträge seit 2008
vor 7 Jahren

Hi LaTino,

das ist mir auch gerade aufgefallen!

Lag schlicht und ergreifend daran, dass ich das aus einem Compact Framework-Projekt kopiert habe.
Da gibt es weder GetValues, noch GetNames.

Schönes Wochenende 😃

3.003 Beiträge seit 2006
vor 7 Jahren

Lag schlicht und ergreifend daran, dass ich das aus einem Compact Framework-Projekt kopiert habe.

Hab' aus Neugier mal in unsere entsprechenden Quellen reingesschaut, nach einem #!if NET_FULL haben wir da nahezu identischen Code. Vergesse immer wieder, wie beknackt CF war/ist...

Dir auch schönes WE.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)