Подтвердить что ты не робот

Как проверить, является ли объект определенным типом

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

Ответ 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

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

Сначала несколько определений:

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

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

  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.

  1. Но здесь есть функция 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"