Prüfen ob gleicher Typ

  • VB.NET

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

    Prüfen ob gleicher Typ

    Hallo!

    Folgendes Beispiel:

    VB.NET-Quellcode

    1. Public Class BaseClass
    2. End Class
    3. Public Class ChildClass
    4. Inherits BaseClass
    5. End Class
    6. Public Class ChildClass2
    7. Inherits ChildClass
    8. End Class
    9. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    10. Dim t = GetType(BaseClass)
    11. Dim c = New BaseClass
    12. Dim c2 = New ChildClass
    13. Dim c3 = New ChildClass2
    14. End Sub


    Nun möchte ich wissen, ob das Objekt c2 vom Typ BaseClass ist, was natürlich der Fall ist, das BaseClass die Basisklasse von
    ChildClass ist. Dies erreicht man recht einfach über: TypeOf c2 is BaseClass - was ein True liefert.
    Auch ein TypeOf c3 Is BaseClass ergibt logischerweise True.

    Jetzt möchte ich das Ganze aber dynamisch halten und per t = GetType(BaseClass) ein TypeObjekt erzeugen.
    Wie kann ich nun prüfen, ob c2 und c3 dem referenzierten Type entspricht.
    Die einzige Möglichkeit die ich gefunden habe ist: t.Equals(c2.GetType.BaseType).
    Bei c3 wäre es aber t.Equals(c2.GetType.BaseType.BaseType).

    Gibt es nicht eine einfache - allgemeine Lösung?
    Da anscheinend niemand eine Idee hat habe ich mir folgende Funktion geschrieben,
    welche mein Problem löst:

    VB.NET-Quellcode

    1. Public Function IsTypeOf(ByVal instanceType As Type, ByVal compareType As Type) As Boolean
    2. Select Case compareType.IsInterface
    3. Case True
    4. Return instanceType.GetInterfaces.Contains(compareType)
    5. Case Else
    6. Select Case True
    7. Case compareType.Equals(instanceType)
    8. Return True
    9. Case instanceType.BaseType IsNot Nothing
    10. Return IsTypeOf(instanceType.BaseType, compareType)
    11. Case Else
    12. Return False
    13. End Select
    14. End Select
    15. End Function
    16. MsgBox(IsTypeOf(c2.GetType, GetType(BaseClass)))
    17. MsgBox(IsTypeOf(c3.GetType, GetType(ChildClass)))
    18. MsgBox(IsTypeOf(c3.GetType, GetType(BaseClass)))


    Aber gibt es dafür nicht schon eine eigene Lösung im Framework?
    Wäre für weitere Ideen dankbar, ansonsten nutze ich meine Funktion!
    Gibt da eine ganz einfache Lösung:

    VB.NET-Quellcode

    1. If TypeOf c2 Is BaseClass Then
    2. MsgBox("C2 ist vom Typ BaseClass oder hat davon geerbt")
    3. Else
    4. MsgBox("C2 hat nichts mit BaseClass zutun")
    5. End If


    lg^^

    Edit: okay, hätte vorher komplett lesen sollen. Da kann ich dir auchnicht helfen.
    Wozu brauchst du es denn "dynamischer"? So wie ich das sehe, braucht deine Funktion die gleichen Informationen wie mein Code, den du ja auch schon kanntest.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FreakJNS“ ()

    Vielen Dank an alle!

    .IsSubClassOf war ein guter Ansatz, muss ich überlesen haben, als ich mir die Members von GetType ansah.
    Dennoch prüft die Methode nur, ob der angegebene Type eine Untertyp ist.
    Unberücksichtigt bleibt der eigene Type oder jedliches Interface.

    Deshalb komme ich um meine Funktion nicht herum - aber dank IsSubClassOf ist sie nun einige Zeilen kürzer

    VB.NET-Quellcode

    1. Public Function IsTypeOf(ByVal instanceType As Type, ByVal compareType As Type) As Boolean
    2. Select Case compareType.IsInterface
    3. Case True
    4. Return instanceType.GetInterfaces.Contains(compareType)
    5. Case Else
    6. Return compareType.Equals(instanceType) _
    7. OrElse instanceType.IsSubclassOf(compareType)
    8. End Select
    9. End Function


    Ich glaube damit kann ich jetzt irgendwie leben ...