myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » .NET-Komponenten und C#-Snippets » Snippet für JavaStyle Enums (Version 0.1)
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Snippet für JavaStyle Enums (Version 0.1)

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
dr4g0n76
myCSharp.de-Poweruser/ Experte

avatar-1768.jpg


Dabei seit: 07.07.2005
Beiträge: 2.880
Entwicklungsumgebung: SharpDevelop/VS.NET
Herkunft: Deutschland


dr4g0n76 ist offline

Snippet für JavaStyle Enums (Version 0.1)

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Java-Style-Enums in C#

Neulich bin ich über Java-Enums gestolpert.
Etwas erstaunt war ich, dass diese nicht äquivalent zu c# oder c++ sind, sondern im Gegenteil dazu noch viel mehr können! Dann kam die Frage auf, wie können wir uns dieses Konzept in C# zunutze machen?

Hier das Ergebnis:

Mit diesem Snippet (unten) kann ein Enum im Style von Java angelegt werden.
Angeregt wurde diese Idee unter anderem durch folgenden Post:

 Java Enum - Oracle

Entweder kann der untere Code in ein Snippet-Editor für C# in Visual Studio eingefügt werden
oder einfach das Snippet unten aus dem Dateianhang herunterladen und die Dateiendung in ".snippet" umändern.

Ich denke hier ist es auch legitim Extension-Methods zu verwenden, um Java möglichst nahe zu kommen. Sie sollten im Idealfall andere Objekte nie stören, da Enums so gesehen keine Funktionen haben.

Bei Oracle gab es dazu folgendes Beispiel:

C#-Code:
public enum Planet {
    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7);

    private final double mass;   // in kilograms
    private final double radius; // in meters
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }
    private double mass() { return mass; }
    private double radius() { return radius; }

    // universal gravitational constant  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;

    double surfaceGravity() {
        return G * mass / (radius * radius);
    }
    double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
    public static void main(String[] args) {
        if (args.length != 1) {
            System.err.println("Usage: java Planet <earth_weight>");
            System.exit(-1);
        }
        double earthWeight = Double.parseDouble(args[0]);
        double mass = earthWeight/EARTH.surfaceGravity();
        for (Planet p : Planet.values())
           System.out.printf("Your weight on %s is %f%n",
                             p, p.surfaceWeight(mass));
    }
}

Hier also das Snippet und unten noch ein Beispiel dazu, wie man einen Java-Style-Enum daraus erstellen kann und dieses benutzt.

C#-Code:
public enum $Testenum$
{
}

public static class $Testenum$Extensions
{
    private static readonly IDictionary<$Testenum$, $Testenum$Data> _map;

    static $Testenum$Extensions()
    {
        _map = new Dictionary<$Testenum$, $Testenum$Data>() {
            //Fill here like Concrete enum value: for example $Testenum$.Value1, new $Testenum$Data(constructor value1, constructor value2, constructor value3, ...)
        };
    }

    public static $Testenum$Data Get$Testenum$Data(this $Testenum$ _value)
    {
        if (!_map.ContainsKey(_value))
            throw new ArgumentOutOfRangeException("_map", "Unknown $Testenum$");
        return _map[_value];
    }

    /*public static int GetValue(this $Testenum$ $Testenum$)
    {
        //Example function
        //just put your code here
        //return Get$Testenum$Data($Testenum$).$Testenum$DataFunctionName;
    }*/

}

public class $Testenum$Data
{
      public $Testenum$Data(/* insert your constructor parameters here */)
      {

      }
}

Hier also der Java-Style-Enum. Ich hab mit Absicht nicht die Planeten-Klasse genommen,
denn ich hoffe es probiert jemand mal aus. Sondern hier was gemacht, um z.B. in einem Abwasch Farben so als Int-Werte ausgeben zu können und ja ich bin mir bewusst, dass es in diesem Falle auch anders geht. :-)

C#-Code:
  public enum Colorable
    {
        Red,
        Green,
        Blue
    }

    public static class ColorableExtensions
    {
        private static readonly IDictionary<Colorable, ColorableData> _map;

        static ColorableExtensions()
        {
            _map = new Dictionary<Colorable, ColorableData>()
            {
                //Fill here like Concrete enum value: for example Colorable.Value1, new ColorableData(constructor value1, constructor value2, constructor value3, ...)
                {Colorable.Red, new ColorableData(Color.Red)},
                {Colorable.Blue, new ColorableData(Color.Blue)},
                {Colorable.Green, new ColorableData(Color.Green)}
            };
        }

        public static ColorableData GetColorableData(this Colorable _value)
        {
            if (!_map.ContainsKey(_value))
                throw new ArgumentOutOfRangeException("_map", "Unknown Colorable");
            return _map[_value];
        }

        public static int RGBValue(this Colorable Colorable)
        {
            //Example function
            //just put your code here
            return GetColorableData(Colorable).RGBValue;
        }
    }

    public class ColorableData
    {
        private readonly Color m_Color;
        public ColorableData(Color _color)
        {
            m_Color = _color;
        }

        public int RGBValue { get { return m_Color.ToArgb(); } }
    }

und zu guter letzt noch ein Beispiel für die Ausgabe:

C#-Code:
  foreach (Colorable color in typeof(Colorable).GetEnumValues())
  {
         MessageBox.Show(color.RGBValue().ToString());
  }

Java Enum


Dateianhang:
unknown JavastyleEnum.txt (2 KB, 159 mal heruntergeladen)
Neuer Beitrag 27.01.2015 12:29 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
malignate
myCSharp.de-Mitglied

avatar-3206.png


Dabei seit: 18.02.2005
Beiträge: 742


malignate ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ganz nett, ich würde aber das wirklich wichtige Problem von Enums lösen:

 Enumeration classes: what do you do about enumerations crossing service boundaries.
Neuer Beitrag 27.01.2015 16:27 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 4 Jahre.
Der letzte Beitrag ist älter als 4 Jahre.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 21.08.2019 15:55