wake-up-neo.com

So prüfen Sie, ob ein Objekt von einem bestimmten Typ ist

Ich übergebe verschiedene Objekte an eine Unterroutine, um denselben Prozess auszuführen, aber jedes Mal ein anderes Objekt zu verwenden. In einem Fall verwende ich beispielsweise eine ListView und in einem anderen Fall übergebe ich eine DropDownList.

Ich möchte überprüfen, ob das übergebene Objekt eine DropDownList ist, und dann Code ausführen, falls dies der Fall ist. Wie mache ich das?

Mein Code bisher, der nicht funktioniert:

Sub FillCategories(ByVal Obj As Object)
    Dim cmd As New SqlCommand("sp_Resources_Categories", Conn)
    cmd.CommandType = CommandType.StoredProcedure
    Obj.DataSource = cmd.ExecuteReader
    If Obj Is System.Web.UI.WebControls.DropDownList Then

    End If
    Obj.DataBind()
End Sub
84
Leah

In VB.NET müssen Sie die Methode GetType verwenden, um den Typ einer Instanz eines Objekts und den Operator GetType() abzurufen. um den Typ eines anderen bekannten Typs abzurufen.

Sobald Sie die beiden Typen haben, können Sie sie einfach mit dem Operator Is vergleichen.

Ihr Code sollte also tatsächlich so geschrieben sein:

Sub FillCategories(ByVal Obj As Object)
    Dim cmd As New SqlCommand("sp_Resources_Categories", Conn)
    cmd.CommandType = CommandType.StoredProcedure
    Obj.DataSource = cmd.ExecuteReader
    If Obj.GetType() Is GetType(System.Web.UI.WebControls.DropDownList) Then

    End If
    Obj.DataBind()
End Sub

Sie können auch den Operator TypeOf anstelle der Methode GetType verwenden. Beachten Sie, dass hiermit überprüft wird, ob Ihr Objekt mit dem angegebenen Typ kompatibel ist, und nicht, ob es vom selben Typ ist. Das würde so aussehen:

If TypeOf Obj Is System.Web.UI.WebControls.DropDownList Then

End If

Völlig trivialer, irrelevanter Nitpick: Traditionell werden die Namen von Parametern beim Schreiben von .NET-Code mit camelCased (dh sie beginnen immer mit einem Kleinbuchstaben) angegeben (entweder VB.NET oder C #). Dies macht es einfach, sie auf einen Blick von Klassen, Typen, Methoden usw. zu unterscheiden.

139
Cody Gray

Einige Details im Zusammenhang mit der Antwort von Cody Gray. Da ich einige Zeit gebraucht habe, um es zu verdauen, dachte ich, es könnte für andere nützlich sein.

Erstens einige Definitionen:

  1. Es gibt TypeNames, bei denen es sich um Zeichenfolgendarstellungen des Typs eines Objekts, einer Schnittstelle usw. handelt. Beispielsweise ist Bar ein TypeName in Public Class Bar Oder in Dim Foo as Bar. TypeNames können als "Beschriftungen" angesehen werden, die im Code verwendet werden, um dem Compiler mitzuteilen, nach welcher Typdefinition in einem Wörterbuch gesucht werden soll, in dem alle verfügbaren Typen beschrieben werden.
  2. Es gibt System.Type Objekte, die einen Wert enthalten. Dieser Wert gibt einen Typ an. Genau wie ein String einen Text oder ein Int eine Zahl annehmen würde, außer dass wir Typen anstelle von Text oder Zahlen speichern. Type Objekte enthalten die Typdefinitionen sowie den zugehörigen TypeName.

Zweitens ist die Theorie:

  1. Foo.GetType() gibt ein Type Objekt zurück, das den Typ für die Variable Foo enthält. Mit anderen Worten, es sagt Ihnen, wovon Foo eine Instanz ist.
  2. GetType(Bar) gibt ein Type Objekt zurück, das den Typ für den TypeName Bar enthält.
  3. In einigen Fällen unterscheidet sich der Typ, von dem ein Objekt Cast war, von dem Typ, von dem ein Objekt zuerst instanziiert wurde. Im folgenden Beispiel ist MyObj ein Integer, der in ein Object umgewandelt wurde:

    Dim MyVal As Integer = 42 Dim MyObj As Object = CType(MyVal, Object)

Ist also MyObj vom Typ Object oder vom Typ Integer? MyObj.GetType() zeigt an, dass es sich um ein Integer handelt.

  1. Aber hier kommt die Funktion Type Of Foo Is Bar, Mit der Sie feststellen können, ob eine Variable Foo mit einem TypeName Bar kompatibel ist. Type Of MyObj Is Integer Und Type Of MyObj Is Object Geben beide True zurück. In den meisten Fällen gibt TypeOf an, dass eine Variable mit einem TypeName kompatibel ist, wenn die Variable zu diesem Typ gehört oder von diesem Typ abgeleitet ist. Weitere Informationen finden Sie hier: https://docs.Microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/typeof-operator#remarks

Der folgende Test veranschaulicht das Verhalten und die Verwendung der genannten Schlüsselwörter und Eigenschaften recht gut.

Public Sub TestMethod1()

    Dim MyValInt As Integer = 42
    Dim MyValDble As Double = CType(MyValInt, Double)
    Dim MyObj As Object = CType(MyValDble, Object)

    Debug.Print(MyValInt.GetType.ToString) 'Returns System.Int32
    Debug.Print(MyValDble.GetType.ToString) 'Returns System.Double
    Debug.Print(MyObj.GetType.ToString) 'Returns System.Double

    Debug.Print(MyValInt.GetType.GetType.ToString) 'Returns System.RuntimeType
    Debug.Print(MyValDble.GetType.GetType.ToString) 'Returns System.RuntimeType
    Debug.Print(MyObj.GetType.GetType.ToString) 'Returns System.RuntimeType

    Debug.Print(GetType(Integer).GetType.ToString) 'Returns System.RuntimeType
    Debug.Print(GetType(Double).GetType.ToString) 'Returns System.RuntimeType
    Debug.Print(GetType(Object).GetType.ToString) 'Returns System.RuntimeType

    Debug.Print(MyValInt.GetType = GetType(Integer)) '# Returns True
    Debug.Print(MyValInt.GetType = GetType(Double)) 'Returns False
    Debug.Print(MyValInt.GetType = GetType(Object)) 'Returns False

    Debug.Print(MyValDble.GetType = GetType(Integer)) 'Returns False
    Debug.Print(MyValDble.GetType = GetType(Double)) '# Returns True
    Debug.Print(MyValDble.GetType = GetType(Object)) 'Returns False

    Debug.Print(MyObj.GetType = GetType(Integer)) 'Returns False
    Debug.Print(MyObj.GetType = GetType(Double)) '# Returns True
    Debug.Print(MyObj.GetType = GetType(Object)) 'Returns False

    Debug.Print(TypeOf MyObj Is Integer) 'Returns False
    Debug.Print(TypeOf MyObj Is Double) '# Returns True
    Debug.Print(TypeOf MyObj Is Object) '# Returns True


End Sub

BEARBEITEN

Sie können auch Information.TypeName(Object) verwenden, um den TypeName eines bestimmten Objekts abzurufen. Beispielsweise,

Dim Foo as Bar
Dim Result as String
Result = TypeName(Foo)
Debug.Print(Result) 'Will display "Bar"
1
Ama