Как проверить, является ли объект определенного типа - PullRequest
84 голосов
/ 05 июля 2011

Я передаю различные объекты подпрограмме для запуска одного и того же процесса, но каждый раз использую разные объекты. Например, в одном случае я использую 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

Ответы [ 2 ]

139 голосов
/ 05 июля 2011

В VB.NET вам нужно использовать метод GetType для получения типа экземпляра объекта и оператор GetType() для получения типа другого известного типа.

Если у вас есть два типа, вы можете просто сравнить их, используя оператор 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

Абсолютно тривиальный нерелевантный указатель: Традиционно имена параметров имеют CamelCased (что означает, что они всегда начинаются со строчной буквы) при написании кода .NET (VB.NET или C #). Это позволяет с первого взгляда отличить их от классов, типов, методов и т. Д.

1 голос
/ 17 апреля 2019

Еще несколько подробностей в связи с ответом Коди Грей.Поскольку мне потребовалось некоторое время, чтобы переварить это, я подумал, что это может быть полезно для других.

Во-первых, некоторые определения:

  1. Существуют TypeNames, которые являются строковыми представлениями типаобъект, интерфейс и т. д. Например, Bar является TypeName в Public Class Bar или в Dim Foo as Bar.TypeNames можно рассматривать как «метки», используемые в коде, чтобы указать компилятору, какое определение типа искать в словаре, где будут описаны все доступные типы.
  2. System.Typeобъекты, которые содержат значение.Это значение указывает тип;точно так же, как String будет принимать текст или Int будет принимать число, за исключением того, что мы храним типы вместо текста или чисел.Type объекты содержат определения типов, а также соответствующее имя типа.

Во-вторых, теория:

  1. Foo.GetType() возвращает объект Type, который содержиттип переменной Foo.Другими словами, он сообщает вам, что Foo является экземпляром.
  2. GetType(Bar) возвращает объект Type, который содержит тип для TypeName Bar.
  3. В некоторых случаях тип объекта был 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

EDIT

Вы также можете использовать Information.TypeName(Object), чтобы получить TypeName данного объекта.Например,

Dim Foo as Bar
Dim Result as String
Result = TypeName(Foo)
Debug.Print(Result) 'Will display "Bar"
...