我确信我不是第一个遇到这个问题的人。搜索“VB.Net isobject”之类的东西什么都不返回,所以答案可能太明显了,不值得发帖。
我的代码:
Dim colItems As Object
colItems = GetObject("winmgmts://./root/cimv2").ExecQuery(strQuery)
Dim objItem As Object
For Each objItem In colItems
If isObject(objItem) Then
If objItem.StatusCode = 0 Then
IsOnline = True
colItems = Nothing
Exit Function
End If
End If
Next
错误:
'IsObject' is not declared. It may be inaccessible due to its protection level.
我认为我需要的是
If Not objItem Is Nothing Then
这是对的吗?
答案 0 :(得分:3)
没有直接等效。 VB6(和is used in VBA)中使用了IsObject
来确定Variant
是否包含对象引用。
由于Object
是VB6的Variant
的VB.NET继承者,甚至内置的基本类型(整数,字符串等)都来自Object
, IsObject
在VB.NET中毫无意义。
最接近的等值可能是IsReference。
答案 1 :(得分:2)
如上所述,IsObject()
在.NET中显然不太有用,但考虑到上下文,看起来你想要测试Nothing
/ null。在这种情况下,这些将起作用
If Not objItem Is Nothing Then ...
' or
If objItem IsNot Nothing Then ...
更重要的是代码不会在Option Strict
下编译:
Dim colItems As Object
colItems = GetObject("winmgmts://./root/cimv2").ExecQuery(strQuery)
Object
没有ExecQuery
方法,因此代码需要后期绑定;同样适用于objItem.StatusCode
。
代码通常看起来可能源自脚本。当Object
有一个很好的.NET包装器时,不需要使用COM接口并处理WMI
和后期绑定。我不知道你在查询什么,这将得到BIOS的序列号:
Option Strict On
Imports System.Management
Public Class WMI
Friend Shared Function ExecWMIQuery(wmiclass As String, queryItem As String) As String
Dim retVal As String = ""
Dim query = String.Format("SELECT {0} FROM {1}", queryItem, wmiclass)
Using searcher As New ManagementObjectSearcher(query)
For Each item As ManagementObject In searcher.Get
Dim p = item.Properties(queryItem)
If (p IsNot Nothing) AndAlso (p.Value IsNot Nothing) Then
retVal = p.Value.ToString
' should be nothing else...
Exit For
End If
Next
End Using
Return retVal
End Function
End Class
用法:
Dim mySerial = WMI.ExecWMIQuery("Win32_Bios", "SerialNumber")
Console.WriteLine(mySerial)
我倾向于小心使用WMI,因为您经常受到制造商选择包含或省略的任何内容的支配,因此需要检查Nothing
等等。
更重要的一点是,System.Management
公开了类型化的对象和集合,因此您不必声明所有内容As Object
,并且可以使用Option Strict
来防止更糟糕的事情发生。
另见: