.net - ManagementObject 和 ManagementBaseObject 之间有什么区别

标签 .net wmi wql

当我编译以下两个代码时,它给出相同的结果(我认为是这样)。

//ManagementObject :
SelectQuery query = new SelectQuery("Win32_Environment");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
foreach (ManagementObject envVar in searcher.Get())
  Console.WriteLine("Variable : {0}, Value = {1}",envVar["Name"], envVar["VariableValue"]);

//ManagementBaseObject :
SelectQuery query = new SelectQuery("Win32_Environment");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
foreach (ManagementBaseObject envVar in searcher.Get())
  Console.WriteLine("Variable : {0}, Value = {1}",envVar["Name"], envVar["VariableValue"]);

这两种代码执行之间有什么区别...?

最佳答案

在这种特殊情况下,没有区别。

ManagementObjectSearcher.Get() 方法返回 ManagementObjectCollection这是 ManagementBaseObject 的集合。这意味着该集合可以包含 ManagementBaseObject 类型的实例或任何源自 ManagementBaseObject 的派生类型的实例。

但是,ManagementBaseObject 被设计为基类,这意味着实际上它不会被实例化,而是会实例化它的派生类。请注意,这只是一个约定,并不是由语言或框架强制执行的。

此外,由于框架中唯一(直接)继承 ManagementBaseObject 的类是 ManagementObjectGet() 有效地返回 ManagementObject 实例的集合。请注意,这只是当前情况,没有什么可以阻止创建其他 ManagementBaseObject 继承者。

因此,考虑到所有提到的警告,这意味着,如果您仅使用基类中定义的属性(而不是重写),您可以以任何一种方式进行迭代,并且代码的行为将完全相同。在您的代码中,您仅使用 indexer ,它确实是在 ManagementBaseObject 类中定义的,而不是被重写。

如果您想要一个在一个循环中失败而在另一个循环中工作的代码示例,您可以尝试在 ManagementObject 上定义的任何属性,例如 Path :

foreach (ManagementObject envVar in searcher.Get())
  Console.WriteLine("Path : {0}, Value = {1}",envVar.Path.Path); //works

foreach (ManagementBaseObject envVar in searcher.Get())
  Console.WriteLine("Path : {0}, Value = {1}",envVar.Path.Path); //compile error

关于.net - ManagementObject 和 ManagementBaseObject 之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14582549/

相关文章:

.net - 检查 WMI ManagementObject 查询是否为 Nothing 而不是使用 Try/Catch?

powershell - 将 WMI 调用转换为 CIM 调用

c# - Microsoft.Management.Infrastructure 命名空间 - Cim 类

windows - WQL 中的 IN 运算符

c# - 这个时间值是什么格式?

powershell - 检索特定的驱动器数据-Get-WmiObject Win32_logicaldisk

c# - IOException 使用 .NET 将大文件从 UNC 路径读取到字节数组中

c# - 在 API 文档中添加第三层

c# - 如何在c#中使用列表中的Except方法

c# - 从 Win32_PrintJob 获取总页数