Estou passando vários objetos para uma sub-rotina para executar o mesmo processo, mas usando um objeto diferente a cada vez. Por exemplo, em um caso estou usando um ListView e em outro caso estou passando um DropDownList.
Eu quero verificar se o objeto que está sendo passado é um DropDownList e executar algum código se for. Como eu faço isso?
Meu código até agora que não 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
é provavelmente uma opção ainda mais simples, pelo menos em termos de legibilidade do código; Também atualizei a resposta com um exemplo disso.Select Case (Obj.GetType())
com vários casos de teste Vs múltiplosIF TypeOf Obj is ...
?Mais alguns detalhes em relação à resposta de Cody Gray. Como demorei algum tempo para digeri-lo, pensei que pudesse ser útil para outras pessoas.
Primeiro, algumas definições:
Bar
é um TypeName inPublic Class Bar
ou inDim Foo as Bar
. TypeNames podem ser vistos como "rótulos" usados no código para informar ao compilador qual definição de tipo procurar em um dicionário, onde todos os tipos disponíveis seriam descritos.System.Type
objetos que contêm um valor. Este valor indica um tipo; da mesma formaString
que um pegaria um texto ouInt
um número, exceto que estamos armazenando tipos em vez de texto ou números.Type
os objetos contêm as definições de tipo, bem como seu TypeName correspondente.Em segundo lugar, a teoria:
Foo.GetType()
retorna umType
objeto que contém o tipo da variávelFoo
. Em outras palavras, ele informa do queFoo
é uma instância.GetType(Bar)
retorna umType
objeto que contém o tipo para o TypeNameBar
.Em alguns casos, o tipo ao qual um objeto foi
Cast
é diferente do tipo a partir do qual um objeto foi instanciado pela primeira vez. No exemplo a seguir, MyObj éInteger
convertido emObject
:Dim MyVal As Integer = 42 Dim MyObj As Object = CType(MyVal, Object)
Então, é
MyObj
do tipoObject
ou do tipoInteger
?MyObj.GetType()
dirá que é umInteger
.Type Of Foo Is Bar
recurso, que permite verificar se uma variávelFoo
é compatível com um TypeNameBar
.Type Of MyObj Is Integer
eType Of MyObj Is Object
ambos retornarão True. Na maioria dos casos, TypeOf indicará que uma variável é compatível com um TypeName se a variável for desse tipo ou um tipo que deriva dele. Mais informações aqui: https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/typeof-operator#remarksO teste abaixo ilustra muito bem o comportamento e o uso de cada uma das palavras-chave e propriedades mencionadas.
EDITAR
Você também pode usar
Information.TypeName(Object)
para obter o TypeName de um determinado objeto. Por exemplo,fonte