none
TypeOf ..Is mit Parameter RRS feed

  • Frage

  • Hallo Leute,
    wie kann ich eine TypeOf..Is mit einem Parameter realisieren.
    Untenstehend der Code, der nicht funktioniert aber zeigt was ich meine.

        Public Function IsType(ByVal O As Object, ByVal T As System.Type) As Boolean
            Return TypeOf O Is T
        End Function

    Vielen Dank im Voraus

    Christian Tauschek

    Sonntag, 7. Januar 2018 13:51

Antworten

  • Hi Christian,
    wenn Du die Funktionsweise von TypeOf haben willst, dann mach es doch generisch:

    Module Module18
      Sub Main()
        Try
          Dim c As New Demo
          c.Execute()
        Catch ex As Exception
          Console.Write(ex.ToString)
        End Try
        Console.WriteLine("weiter mit Taste")
        Console.ReadKey()
      End Sub
    
      Class Demo
        Friend sT As String = "xxx"
        Friend Sub Execute()
          Dim c1 As New Basisklasse
          Dim c2 As New ErbendeKlasse
          Console.WriteLine(IsType1(c1, GetType(Basisklasse)))
          Console.WriteLine(IsType1(c2, GetType(Basisklasse)))
          Console.WriteLine(IsType1(c1, GetType(ErbendeKlasse)))
          Console.WriteLine(IsType1(c2, GetType(ErbendeKlasse)))
          Console.WriteLine(IsType2(Of Basisklasse)(c1))
          Console.WriteLine(IsType2(Of Basisklasse)(c2))
          Console.WriteLine(IsType2(Of ErbendeKlasse)(c1))
          Console.WriteLine(IsType2(Of ErbendeKlasse)(c2))
        End Sub
        Public Function IsType1(ByVal o As Object, ByVal T As Type) As Boolean
          Return o.GetType = T
        End Function
        Public Function IsType2(Of T)(ByVal o As Object) As Boolean
          Return TypeOf o Is T
        End Function
      End Class
    
      Class Basisklasse
    
      End Class
      Class ErbendeKlasse
        Inherits Basisklasse
      End Class
    End Module


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

    Sonntag, 7. Januar 2018 18:34
  • Hallo Christian

    vielleicht hilft dies weiter:

    Public Function IsType(ByVal O As Object, ByVal T As Type) As Boolean
        If T.IsInterface Then
          Return T.IsAssignableFrom(O.GetType)
        Else
          Return (O.GetType.Equals(T)) Or (O.GetType.IsSubclassOf(T))
        End If
    End Function

    Mit diesen Beispielklassen...

    Public Class BaseClass
    End Class
    
    Public Class DerivedClass
      Inherits BaseClass
    End Class
    Kannst du in einer Konsole testen:
    Sub Main()
        Dim oDerived = New DerivedClass()
        Dim oBase = New BaseClass
        Dim text As String = "Hallo"
    
        Console.WriteLine($"{IsType(text, GetType(IList))} - { TypeOf text Is IList} ")
        Console.WriteLine($"{IsType(text, GetType(IEnumerable))} - { TypeOf text Is IEnumerable} ")
        Console.WriteLine()
        Console.WriteLine($"{IsType(oDerived, GetType(DerivedClass))} - { TypeOf oDerived Is DerivedClass} ")
        Console.WriteLine($"{IsType(oDerived, GetType(BaseClass))} - { TypeOf oDerived Is BaseClass} ")
        Console.WriteLine()
        Console.WriteLine($"{IsType(oBase, GetType(DerivedClass))} - { TypeOf oBase Is DerivedClass}")
        Console.WriteLine($"{IsType(oBase, GetType(BaseClass))} - {TypeOf oBase Is BaseClass} ")
    
        Console.ReadKey()
    End Sub

    Gruß

    • Als Antwort markiert Christian Tauschek Sonntag, 7. Januar 2018 19:45
    • Bearbeitet K. Pater Sonntag, 7. Januar 2018 19:50 Beispiel erweitert...
    Sonntag, 7. Januar 2018 19:15

Alle Antworten

  • Hallo Christian,

    du kannst das Type-Objekt von O einfach über O.GetType() abrufen und dieses dann anschließend mit T vergleichen:

    Public Function IsType(ByVal o As Object, ByVal T As System.Type) As Boolean
        Return o.[GetType]() = T
    End Function
    


    Viele Grüße, Tom Lambert - MVP, MCC und MSP
    Wozu Antworten markieren und Posts bewerten? Klicke hier
    Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
    Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub

    Sonntag, 7. Januar 2018 14:18
    Moderator
  • Hallo Tom,
    das ist nicht ganz gleich, weil TypeOf liefert auch dann True, wenn das Objekt eine von T abgeleitete Klasse ist.

    zB.:
    Class cParent
    End Class

    Class cChild
       inherits cParent
    End Class

    O = New cChild
    TypeOf O is cParent 'Liefert TRUE
    O.GetType Is GetType(cParent) 'liefert FALSE

    Deinen Code "o.[GetType]() = T" kann ich nicht verwenden. Ich vermute mal deshalb, weil ich VS2008 verwende.

    mfg
    Christian


    Christian Tauschek


    Sonntag, 7. Januar 2018 16:35
  • Hi Christian,
    wenn Du die Funktionsweise von TypeOf haben willst, dann mach es doch generisch:

    Module Module18
      Sub Main()
        Try
          Dim c As New Demo
          c.Execute()
        Catch ex As Exception
          Console.Write(ex.ToString)
        End Try
        Console.WriteLine("weiter mit Taste")
        Console.ReadKey()
      End Sub
    
      Class Demo
        Friend sT As String = "xxx"
        Friend Sub Execute()
          Dim c1 As New Basisklasse
          Dim c2 As New ErbendeKlasse
          Console.WriteLine(IsType1(c1, GetType(Basisklasse)))
          Console.WriteLine(IsType1(c2, GetType(Basisklasse)))
          Console.WriteLine(IsType1(c1, GetType(ErbendeKlasse)))
          Console.WriteLine(IsType1(c2, GetType(ErbendeKlasse)))
          Console.WriteLine(IsType2(Of Basisklasse)(c1))
          Console.WriteLine(IsType2(Of Basisklasse)(c2))
          Console.WriteLine(IsType2(Of ErbendeKlasse)(c1))
          Console.WriteLine(IsType2(Of ErbendeKlasse)(c2))
        End Sub
        Public Function IsType1(ByVal o As Object, ByVal T As Type) As Boolean
          Return o.GetType = T
        End Function
        Public Function IsType2(Of T)(ByVal o As Object) As Boolean
          Return TypeOf o Is T
        End Function
      End Class
    
      Class Basisklasse
    
      End Class
      Class ErbendeKlasse
        Inherits Basisklasse
      End Class
    End Module


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

    Sonntag, 7. Januar 2018 18:34
  • Hallo Christian

    vielleicht hilft dies weiter:

    Public Function IsType(ByVal O As Object, ByVal T As Type) As Boolean
        If T.IsInterface Then
          Return T.IsAssignableFrom(O.GetType)
        Else
          Return (O.GetType.Equals(T)) Or (O.GetType.IsSubclassOf(T))
        End If
    End Function

    Mit diesen Beispielklassen...

    Public Class BaseClass
    End Class
    
    Public Class DerivedClass
      Inherits BaseClass
    End Class
    Kannst du in einer Konsole testen:
    Sub Main()
        Dim oDerived = New DerivedClass()
        Dim oBase = New BaseClass
        Dim text As String = "Hallo"
    
        Console.WriteLine($"{IsType(text, GetType(IList))} - { TypeOf text Is IList} ")
        Console.WriteLine($"{IsType(text, GetType(IEnumerable))} - { TypeOf text Is IEnumerable} ")
        Console.WriteLine()
        Console.WriteLine($"{IsType(oDerived, GetType(DerivedClass))} - { TypeOf oDerived Is DerivedClass} ")
        Console.WriteLine($"{IsType(oDerived, GetType(BaseClass))} - { TypeOf oDerived Is BaseClass} ")
        Console.WriteLine()
        Console.WriteLine($"{IsType(oBase, GetType(DerivedClass))} - { TypeOf oBase Is DerivedClass}")
        Console.WriteLine($"{IsType(oBase, GetType(BaseClass))} - {TypeOf oBase Is BaseClass} ")
    
        Console.ReadKey()
    End Sub

    Gruß

    • Als Antwort markiert Christian Tauschek Sonntag, 7. Januar 2018 19:45
    • Bearbeitet K. Pater Sonntag, 7. Januar 2018 19:50 Beispiel erweitert...
    Sonntag, 7. Januar 2018 19:15