Estoy pasando varios objetos a una subrutina para ejecutar el mismo proceso pero usando un objeto diferente cada vez. Por ejemplo, en un caso estoy usando un ListView y en otro caso estoy pasando un DropDownList.
Quiero verificar si el objeto que se pasa es un DropDownList y luego ejecutar algún código si lo es. ¿Cómo hago esto?
Mi código hasta ahora que no funciona:
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
es probablemente una opción aún más simple, al menos en términos de legibilidad del código; También actualicé la respuesta con un ejemplo de eso.Select Case (Obj.GetType())
con múltiples casos de prueba Vs múltiplesIF TypeOf Obj is ...
?Algunos detalles más en relación con la respuesta de Cody Gray. Como me tomó un tiempo digerirlo, pensé que podría ser útil para otros.
Primero, algunas definiciones:
Bar
es un TypeName enPublic Class Bar
o enDim Foo as Bar
. TypeNames podría verse como "etiquetas" utilizadas en el código para decirle al compilador qué definición de tipo buscar en un diccionario donde se describirían todos los tipos disponibles.System.Type
objetos que contienen un valor. Este valor indica un tipo; al igualString
que a tomaría un texto oInt
tomaría un número, excepto que estamos almacenando tipos en lugar de texto o números.Type
los objetos contienen las definiciones de tipo, así como su correspondiente TypeName.En segundo lugar, la teoría:
Foo.GetType()
devuelve unType
objeto que contiene el tipo de la variableFoo
. En otras palabras, le dice quéFoo
es una instancia de.GetType(Bar)
devuelve unType
objeto que contiene el tipo de TypeNameBar
.En algunos casos, el tipo al que ha pertenecido un objeto
Cast
es diferente del tipo del que se creó una instancia por primera vez. En el siguiente ejemplo, MyObj se convierteInteger
en unObject
:Dim MyVal As Integer = 42 Dim MyObj As Object = CType(MyVal, Object)
Entonces, ¿es
MyObj
de tipoObject
o de tipoInteger
?MyObj.GetType()
te dirá que es unInteger
.Type Of Foo Is Bar
función, que le permite determinar que una variableFoo
es compatible con un TypeNameBar
.Type Of MyObj Is Integer
yType Of MyObj Is Object
ambos devolverán True. En la mayoría de los casos, TypeOf indicará que una variable es compatible con un TypeName si la variable es de ese tipo o de un tipo que se deriva de él. Más información aquí: https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/typeof-operator#remarksLa siguiente prueba ilustra bastante bien el comportamiento y el uso de cada una de las palabras clave y propiedades mencionadas.
EDITAR
También puede utilizar
Information.TypeName(Object)
para obtener el TypeName de un objeto determinado. Por ejemplo,fuente