2

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

//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"]);

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

4

2 回答 2

3

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

ManagementObjectSearcher.Get()方法返回 a ManagementObjectCollection,它是 的集合 ManagementBaseObject。这意味着集合可以包含 typeManagementBaseObject的实例或任何从ManagementBaseObject.

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

此外,由于框架中唯一(直接)继承ManagementBaseObjectis 的类ManagementObject,因此有效地返回了一个实例Get()集合。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
于 2013-01-29T12:28:39.687 回答
1

你最好ManagementBaseObject在这里使用。该Get()方法返回一个(非泛型)ManagementObjectCollection,其中包含ManagementBaseObject衍生类型,包括ManagementObjectManagementClass

第一个版本可能适用于您的特定查询,但通常您可能会收到无效的强制转换异常。

如果您只需要考虑类型的对象,ManagementObject您可以考虑以下版本:

var query = new SelectQuery("Win32_Environment");
var searcher = new ManagementObjectSearcher(query);
foreach (var envVar in searcher.Get().OfType<ManagementObject>())
{
    Console.WriteLine("Variable: {0}, Value = {1}", 
        envVar["Name"], envVar["VariableValue"]);
}
于 2013-01-29T12:28:08.987 回答