none
Strings für ENUM möglich? RRS feed

  • Frage

  • Hallo Leute,

    ist es irgendwie möglich, folgende ENUM Struktur zu implementieren? Derzeit bekomme ich die Fehlermeldung "Eine implizite Konvertierung von string zu int ist nicht möglich". Ich würde ja mitunter auch die Methode toString() verwenden, klappt aber nicht.

            enum ComboType {
                NONE = "Please, choose an option",
                DREHEN = "Nur um 90° Grad rechts drehen",
                HOZS = "Nur Horizontal spiegeln",
                VTS = "Nur Vertikal spiegeln"
            }

    Derzeit löse ich das Problem so:

       internal static class ComboType {
            public const string NONE = "Please, choose an option";
            public const string DREHEN = "Nur um 90° Grad rechts drehen";
            public const string HOZS = "Nur Horizontal spiegeln";
            public const string VTS = "Nur Vertikal spiegeln";
    
        }

    • Bearbeitet tklustig Freitag, 30. November 2018 19:58
    Freitag, 30. November 2018 19:46

Antworten

  • Hi,

    sowas kann schon nützlich sein. Aber auf direktem Wege erreichst Du das nicht. Mit ein wenig (einmaliger) Arbeit aber schon.

    Im ersten Schritt erstellst Du dir eine eigene Attributklasse, die den String zum Enum aufnehmen kann.

    public class EnumAsStringAttribute : Attribute
    {
        private string _name;
    
        public EnumAsStringAttribute( String name )
        {
            _name = name;
        }
    
        public string Name
        {
            get
            {
                return _name;
            }
        }
    }

    Um das Ganze wieder auszulesen, brauchst Du noch eine entsprechende Erweiterungsmethode für Enums.

    public static class Extensions
    {
        public static String ToEnumString( this Enum item )
        {
            EnumAsStringAttribute[] attributes;
            String result = String.Empty;
            FieldInfo fi;
            fi = item.GetType().GetField( item.ToString() );
    
            if( fi != null ) {
                attributes = (EnumAsStringAttribute[])( fi.GetCustomAttributes( typeof(EnumAsStringAttribute), true ) );
                if( attributes.Length < 1 ) {
                    result = item.ToString();
                } else {                    
                    result = attributes[ 0 ].Name;
                }
            } else {
                result = item.ToString();
            }
            return result;
        }
    }

    Der Rest ist dann ganz einfach. Deklariere den Enum wie folgt:

    public class Enums
    {
        public enum MyEnum
        {
            [EnumAsString( "Erster Enumwert" )]
            First = 1,
            [EnumAsString( "Zweiter Enumwert" )]
            Second = 2,
            [EnumAsString( "Dritter Enumwert" )]
            Third = 3
        }
    }

    Dann kannst Du bspw. auf diese Art darauf zugreifen:

    Enums.MyEnum.First.ToEnumString();

    Bspw. für eine Ausgabe in der Konsole:

    Console.WriteLine( Enums.MyEnum.First.ToEnumString() );
    Console.WriteLine( Enums.MyEnum.Second.ToEnumString() );
    Console.WriteLine( Enums.MyEnum.Third.ToEnumString() );

    HTH


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Freitag, 30. November 2018 22:46
    Moderator
  • Hi,
    unklar ist, was Du erreichen willst.

    Eine Aufzählung (enum) hat lediglich das Ziel, im Code mit Begriffen arbeiten zu können, die dann im Kompilat gegen eine üblicherweise einfache (schlecht lesbare) Binärdarstellung ersetzt wird. Als Binärdarstellung ist nur eine Zahl (numerischer Wertetyp) möglich.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert tklustig Freitag, 30. November 2018 21:16
    Freitag, 30. November 2018 21:10

Alle Antworten

  • Hi,
    unklar ist, was Du erreichen willst.

    Eine Aufzählung (enum) hat lediglich das Ziel, im Code mit Begriffen arbeiten zu können, die dann im Kompilat gegen eine üblicherweise einfache (schlecht lesbare) Binärdarstellung ersetzt wird. Als Binärdarstellung ist nur eine Zahl (numerischer Wertetyp) möglich.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert tklustig Freitag, 30. November 2018 21:16
    Freitag, 30. November 2018 21:10
  • Hi,

    sowas kann schon nützlich sein. Aber auf direktem Wege erreichst Du das nicht. Mit ein wenig (einmaliger) Arbeit aber schon.

    Im ersten Schritt erstellst Du dir eine eigene Attributklasse, die den String zum Enum aufnehmen kann.

    public class EnumAsStringAttribute : Attribute
    {
        private string _name;
    
        public EnumAsStringAttribute( String name )
        {
            _name = name;
        }
    
        public string Name
        {
            get
            {
                return _name;
            }
        }
    }

    Um das Ganze wieder auszulesen, brauchst Du noch eine entsprechende Erweiterungsmethode für Enums.

    public static class Extensions
    {
        public static String ToEnumString( this Enum item )
        {
            EnumAsStringAttribute[] attributes;
            String result = String.Empty;
            FieldInfo fi;
            fi = item.GetType().GetField( item.ToString() );
    
            if( fi != null ) {
                attributes = (EnumAsStringAttribute[])( fi.GetCustomAttributes( typeof(EnumAsStringAttribute), true ) );
                if( attributes.Length < 1 ) {
                    result = item.ToString();
                } else {                    
                    result = attributes[ 0 ].Name;
                }
            } else {
                result = item.ToString();
            }
            return result;
        }
    }

    Der Rest ist dann ganz einfach. Deklariere den Enum wie folgt:

    public class Enums
    {
        public enum MyEnum
        {
            [EnumAsString( "Erster Enumwert" )]
            First = 1,
            [EnumAsString( "Zweiter Enumwert" )]
            Second = 2,
            [EnumAsString( "Dritter Enumwert" )]
            Third = 3
        }
    }

    Dann kannst Du bspw. auf diese Art darauf zugreifen:

    Enums.MyEnum.First.ToEnumString();

    Bspw. für eine Ausgabe in der Konsole:

    Console.WriteLine( Enums.MyEnum.First.ToEnumString() );
    Console.WriteLine( Enums.MyEnum.Second.ToEnumString() );
    Console.WriteLine( Enums.MyEnum.Third.ToEnumString() );

    HTH


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Freitag, 30. November 2018 22:46
    Moderator
  • Hi,

    war mein Beispiel nicht für deine Zwecke geeignet? Frage rein interessehalber, da ich deine Problemstellung evtl. auch falsch verstanden hatte.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Montag, 3. Dezember 2018 22:06
    Moderator