Я передаю различные объекты подпрограмме для запуска одного и того же процесса, но каждый раз использую другой объект. Например, в одном случае я использую ListView, а в другом - передаю DropDownList.
Я хочу проверить, является ли переданный объект DropDownList, а затем выполнить некоторый код, если это так. Как мне это сделать?
Мой код пока не работает:
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
возможно, даже более простой вариант, по крайней мере, с точки зрения читабельности кода; Я тоже обновил ответ примером этого.Select Case (Obj.GetType())
нескольких тестовых случаев против несколькихIF TypeOf Obj is ...
?Еще несколько деталей в связи с ответом Коди Грея. Поскольку мне потребовалось некоторое время, чтобы переварить его, я подумал, что это может быть полезно другим.
Для начала несколько определений:
Bar
это TypeName inPublic Class Bar
или inDim Foo as Bar
. TypeNames можно рассматривать как «метки», используемые в коде, чтобы сообщить компилятору, какое определение типа искать в словаре, где будут описаны все доступные типы.System.Type
объекты, которые содержат значение. Это значение указывает тип; точно так же, как aString
принимает текст илиInt
число, за исключением того, что мы сохраняем типы вместо текста или чисел.Type
объекты содержат определения типа, а также соответствующее ему имя типа.Во-вторых, теория:
Foo.GetType()
возвращаетType
объект, содержащий тип переменнойFoo
. Другими словами, он сообщает вам, чтоFoo
является экземпляром.GetType(Bar)
возвращаетType
объект, который содержит тип для TypeNameBar
.В некоторых случаях тип объекта
Cast
отличается от типа, из которого объект был впервые создан. В следующем примере MyObj является преобразованиемInteger
вObject
:Dim MyVal As Integer = 42 Dim MyObj As Object = CType(MyVal, Object)
Итак,
MyObj
типаObject
или типаInteger
?MyObj.GetType()
скажу вам, что этоInteger
.Type Of Foo Is Bar
функция, которая позволяет вам убедиться, что переменнаяFoo
совместима с TypeNameBar
.Type Of MyObj Is Integer
иType Of MyObj Is Object
оба вернут True. В большинстве случаев TypeOf будет указывать, что переменная совместима с TypeName, если переменная относится к этому типу или типу, производному от него. Подробнее здесь: https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/typeof-operator#remarksПриведенный ниже тест достаточно хорошо иллюстрирует поведение и использование каждого из упомянутых ключевых слов и свойств.
РЕДАКТИРОВАТЬ
Вы также можете использовать
Information.TypeName(Object)
для получения TypeName данного объекта. Например,источник