Как проверить, является ли объект определенным типом
Я передаю различные объекты в подпрограмму для запуска того же процесса, но каждый раз с помощью другого объекта. Например, в одном случае я использую 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
Ответы
Ответ 1
В VB.NET вам нужно использовать метод GetType
, чтобы получить тип экземпляра объекта, а GetType()
operator, чтобы получить тип другого известного типа.
Как только у вас есть два типа, вы можете просто сравнить их с помощью оператора Is
.
Итак, ваш код должен быть написан следующим образом:
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
Вы также можете использовать TypeOf
оператор вместо метода GetType
. Обратите внимание, что это проверяет, совместим ли ваш объект с данным типом, а не тот же тип. Это будет выглядеть так:
If TypeOf Obj Is System.Web.UI.WebControls.DropDownList Then
End If
Полностью тривиальный, нерелевантный nitpick: традиционно имена параметров camelCased (что означает, что они всегда начинаются с строчной буквы) при написании .NET-кода (либо VB.NET, либо С#). Это позволяет легко отличить их от классов, типов, методов и т.д.
Ответ 2
Еще несколько подробностей в связи с ответом Коди Грея. Поскольку мне потребовалось некоторое время, чтобы переварить это, я думал, что это может быть полезно для других.
Сначала несколько определений:
- Существуют TypeNames, которые являются строковыми представлениями типа объекта, интерфейса и т.д. Например,
Bar
- это TypeName в Public Class Bar
или в Dim Foo as Bar
. TypeNames можно рассматривать как "метки", используемые в коде, чтобы сообщить компилятору, какое определение типа искать в словаре, где будут описаны все доступные типы. - Существуют объекты
System.Type
которые содержат значение. Это значение указывает тип; Точно так же, как String
будет принимать некоторый текст, или Int
будет принимать число, за исключением того, что мы храним типы вместо текста или чисел. Type
объект содержит определения типа, а также его соответствующий TypeName.
Во-вторых, теория:
-
Foo.GetType()
возвращает объект Type
который содержит тип для переменной Foo
. Другими словами, он говорит вам, что такое Foo
. -
GetType(Bar)
возвращает объект Type
который содержит тип для TypeName Bar
. -
В некоторых случаях, тип объект был 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
совместима с TypeName Bar
. 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
Тест ниже хорошо иллюстрирует поведение и использование каждого из упомянутых ключевых слов и свойств.
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
РЕДАКТИРОВАТЬ
Вы также можете использовать Information.TypeName(Object)
чтобы получить TypeName данного объекта. Например,
Dim Foo as Bar
Dim Result as String
Result = TypeName(Foo)
Debug.Print(Result) 'Will display "Bar"