Przekazuję różne obiekty do podprogramu, aby uruchomić ten sam proces, ale za każdym razem używam innego obiektu. Na przykład w jednym przypadku używam ListView, aw innym przekazuję DropDownList.
Chcę sprawdzić, czy przekazywany obiekt jest DropDownList, a następnie wykonać kod, jeśli tak jest. Jak mam to zrobic?
Mój kod do tej pory nie działa:
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
TypeOf
jest prawdopodobnie jeszcze prostszą opcją, przynajmniej pod względem czytelności kodu; Zaktualizowałem odpowiedź, podając przykład.Select Case (Obj.GetType())
z wieloma przypadkami testowymi i wielomaIF TypeOf Obj is ...
?Więcej szczegółów w związku z odpowiedzią Cody Graya. Ponieważ strawienie go zajęło mi trochę czasu, pomyślałem, że może się przydać innym.
Najpierw kilka definicji:
Bar
jest TypeName wPublic Class Bar
lub wDim Foo as Bar
. TypeNames można postrzegać jako „etykiety” używane w kodzie, aby poinformować kompilator, której definicji typu ma szukać w słowniku, w którym opisane zostaną wszystkie dostępne typy.System.Type
obiekty, które zawierają wartość. Ta wartość wskazuje typ; tak samo, jakString
przyjmowałoby jakiś tekst lubInt
przyjmowałoby liczbę, z wyjątkiem tego, że przechowujemy typy zamiast tekstu lub liczb.Type
obiekty zawierają definicje typów, a także odpowiadające im TypeName.Po drugie, teoria:
Foo.GetType()
zwracaType
obiekt, który zawiera typ zmiennejFoo
. Innymi słowy, mówi ci, czymFoo
jest instancja.GetType(Bar)
zwracaType
obiekt, który zawiera typ dla TypeNameBar
.W niektórych przypadkach typ, do którego był obiekt,
Cast
różni się od typu, z którego został utworzony obiekt. W poniższym przykładzie MyObj jestInteger
rzutowaniem naObject
:Dim MyVal As Integer = 42 Dim MyObj As Object = CType(MyVal, Object)
Więc jest
MyObj
typuObject
czy typuInteger
?MyObj.GetType()
powie ci, że jest to plikInteger
.Type Of Foo Is Bar
funkcja, która pozwala upewnić się, że zmiennaFoo
jest zgodna z TypeNameBar
.Type Of MyObj Is Integer
iType Of MyObj Is Object
oba zwrócą True. W większości przypadków TypeOf wskaże, że zmienna jest zgodna z TypeName, jeśli zmienna jest tego typu lub Type, który z niej pochodzi. Więcej informacji tutaj: https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/typeof-operator#remarksPoniższy test dość dobrze ilustruje zachowanie i użycie każdego z wymienionych słów kluczowych i właściwości.
EDYTOWAĆ
Możesz również użyć,
Information.TypeName(Object)
aby uzyskać TypeName danego obiektu. Na przykład,źródło