Integer automatisch als Enum casten

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Integer automatisch als Enum casten

    Hallo,

    in meinem Projekt habe ich ein Modul 'Customer' mir der Eigenschaft 'Gender'. Diese ist ein Enum;

    VB.NET-Quellcode

    1. Public Enum GenderType As UInteger
    2. MALE = 0
    3. FEMALE = 1
    4. NEUTRAL = 2
    5. End Enum
    6. Public Gender as GenderType


    Gender war ehemals als UInteger deklariert, genau so wie viele weitere Eigenschaften. Ich wollte dazu übergehen wenn möglich Enums zu verwenden, doch nun habe ich an etlichen Stellen im Code ein Problem, da bei - OPTION STRICT ON - eine direkte Konvertierung von UInteger zu GenderType nicht möglich ist.
    Ich möchte vermeiden jetzt an tausenden Stellen einen CType einzubauen oder sonst wie lokal den UInteger zu casten.
    Geht das vielleicht irgendwie über eine Property die man überläd, oder gibt es gar einen viel einfacheren Weg?

    Vielen Dank

    *alliance schrieb:

    jetzt an tausenden Stellen einen CType einzubauen
    Du hast 2 Möglichkeiten:

    VB.NET-Quellcode

    1. Gender = CType(1, GenderType)
    2. ' oder
    3. Gender = GenderType.FEMALE
    Alles andere ist Murks
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Stimmt, hätte ich erwähnen sollen...
    Immer dann wenn die Gender Eigenschaft gesetzt wird:

    VB.NET-Quellcode

    1. Dim customerA as New Customer
    2. customerA.Gender = SQLQUERY_INT("SELECT `gender` FROM `customers` WHERE `id`='1'")


    RodFromGermany schrieb:

    *alliance schrieb:

    jetzt an tausenden Stellen einen CType einzubauen
    Du hast 2 Möglichkeiten:

    VB.NET-Quellcode

    1. Gender = CType(1, GenderType)
    2. ' oder
    3. Gender = GenderType.FEMALE
    Alles andere ist Murks


    Die zweite Methode fällt schonmal flach, siehe oben...
    @*alliance Dann mach Dir eine Funktion, die genau das tut.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    @*alliance Dann mach Dir eine Funktion, die genau das tut.


    Naja, selbst dann muss ich das immer lokal einbauen.
    Werde da offensichtlich nicht drumherum kommen, dann bleib ich doch gleich beim CType.

    Hatte es auch mit einer Property versucht:

    VB.NET-Quellcode

    1. Private _charGender As GenderType
    2. Public Overloads Property Gender(ByVal genderType As GenderType) As GenderType
    3. Get
    4. Return _charGender
    5. End Get
    6. Set(value As GenderType)
    7. _charGender = genderType
    8. End Set
    9. End Property
    10. Public Overloads Property Gender(ByVal id As UInteger) As UInteger
    11. Get
    12. Return CUInt(_charGender)
    13. End Get
    14. Set(value As UInteger)
    15. _charGender = CType(id, GenderType)
    16. End Set
    17. End Property
    18. Dim customerA as New Customer
    19. customerA.Gender = SQLQUERY_INT("SELECT `gender` FROM `customers` WHERE `id`='1'")

    Bekomme da aber einen 'Überladungsfehler.
    Lass das (ByVal genderType As GenderType) bei der ersten Property weg - der will, dass du ihm da etwas hinschreibst. Oh. Und beim Setter musst du value nehmen.

    *alliance schrieb:

    Hatte es auch mit einer Property versucht:
    Lege Dich zunächst mal fest, was Du haben willst.
    Ich meinte eine Funktion, die aus einem Integer einen Enum macht.
    Ggf. brauchst Du noch eine für die Gegenrichtung.
    Mach die Shared.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Higlav schrieb:

    Lass das (ByVal genderType As GenderType) bei der ersten Property weg - der will, dass du ihm da etwas hinschreibst. Oh. Und beim Setter musst du value nehmen.

    Ok, so siehts aus:

    VB.NET-Quellcode

    1. Private _charGender As GenderType
    2. Public Property Gender() As GenderType
    3. Get
    4. Return _charGender
    5. End Get
    6. Set(value As GenderType)
    7. _charGender = value
    8. End Set
    9. End Property
    10. Public Property Gender(ByVal id As UInteger) As UInteger
    11. Get
    12. Return _charGender
    13. End Get
    14. Set(value As UInteger)
    15. _charGender = CType(value, GenderType)
    16. End Set
    17. End Property


    Habe aber jetzt einen anderen Fehler bei:

    VB.NET-Quellcode

    1. Dim customerA as New Customer
    2. customerA.Gender = SQLQUERY_INT("SELECT `gender` FROM `customers` WHERE `id`='1'")

    "OptionStrict On lässt keine impliziten Konvertierungen von UInteger in GenderType zu"

    @RodFromGermany
    Aber diese Funktion müsste doch genauso wie CType immer lokal aufgerufen werden:

    VB.NET-Quellcode

    1. Dim customerA as New Customer
    2. customerA.Gender = ConvertToGenderType(SQLQUERY_INT("SELECT `gender` FROM `customers` WHERE `id`='1'"))

    *alliance schrieb:

    lokal aufgerufen werden
    Hör auf über Bits zu diskutieren, leg Dich zunächst fest, üb Du in Deinem Projekt mit UInteger oder Enum arbeiten willst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    WhitePage schrieb:

    *alliance schrieb:

    customerA.Gender


    Damit rufst du die erste Überladung auf, die Enum erwartet. Wenn du die zweite Überladung aufrufen willst, musst du ja das Argument mitgeben:

    VB.NET-Quellcode

    1. customerA.Gender(0) = SQLQUERY_INT("SELECT `gender` FROM `customers` WHERE `id`='1'")

    OK,
    dass lässt sich ja noch relativ schnell mit der "Ersetzen"-Funktionalität in Visual Studio umsetzen. Danke!

    RodFromGermany schrieb:

    *alliance schrieb:

    lokal aufgerufen werden
    Hör auf über Bits zu diskutieren, leg Dich zunächst fest, üb Du in Deinem Projekt mit UInteger oder Enum arbeiten willst.

    Ich möchte gerne die Vorteile beider nutzen. UInteger: Weil sich das aus den Datenquellen so ergibt und Enums um bei Abfragen (z.B. if gender = GenderType.FEMALE) einen etwas aussagekräftigeren Ausdruck im Code zu haben. Außerdem benötige ich bei anderen Eigenschaften noch den <Flags> tag bei Enums.

    *alliance schrieb:

    (z.B. if gender = GenderType.FEMALE)
    geht mit

    VB.NET-Quellcode

    1. Public Class GenderType
    2. Public Const MALE As UInteger = 0
    3. Public Const FEMALE As UInteger = 1
    4. Public Const NEUTRAL As UInteger = 2
    5. End Class
    mit Typprüfung auf UInteger.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    *alliance schrieb:

    (z.B. if gender = GenderType.FEMALE)
    geht mit

    VB.NET-Quellcode

    1. Public Class GenderType
    2. Public Const MALE As UInteger = 0
    3. Public Const FEMALE As UInteger = 1
    4. Public Const NEUTRAL As UInteger = 2
    5. End Class
    mit Typprüfung auf UInteger.

    Wie kann ich denn nun GenderType anhand eines UItegers setzen?

    VB.NET-Quellcode

    1. Public Gender as GenderType
    2. Gender = 0

    haut ja nicht hin...

    ~blaze~ schrieb:

    Warum lagerst du nicht einfach die Query aus und konvertierst dort zum Enum? Enum wäre so gesehen schon die beste Lösung.

    Gruß
    ~blaze~

    Das wäre auch noch eine Möglichkeit, nicht alle Eigenschaften werden zwar über Querys gesetzt, aber immerhin spart man sich da was Arbeit.

    *alliance schrieb:

    Wie kann ich denn nun

    RodFromGermany schrieb:

    leg Dich zunächst fest, üb Du in Deinem Projekt mit UInteger oder Enum arbeiten willst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!