.net ManagementObject和ManagementBaseObject之间的区别是什么
当我编译以下两个代码时,它给出了相同的结果(我认为是这样).net ManagementObject和ManagementBaseObject之间的区别是什么,.net,wmi,wql,.net,Wmi,Wql,当我编译以下两个代码时,它给出了相同的结果(我认为是这样) 这两种代码执行之间的区别是什么 您最好在此处使用ManagementBaseObject。Get()方法返回一个包含ManagementBaseObject派生类型的(非泛型),包括ManagementObject和ManagementClass 第一个版本可能适用于您的特定查询,但通常您可能会得到无效的强制转换异常 如果您只需要考虑类型管理对象< /代码>的对象,您可以考虑以下版本: var query = new SelectQue
这两种代码执行之间的区别是什么 您最好在此处使用
ManagementBaseObject
。Get()
方法返回一个包含ManagementBaseObject
派生类型的(非泛型),包括ManagementObject
和ManagementClass
第一个版本可能适用于您的特定查询,但通常您可能会得到无效的强制转换异常
如果您只需要考虑类型<代码>管理对象< /代码>的对象,您可以考虑以下版本:
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"]);
}
var query=new SelectQuery(“Win32_环境”);
var searcher=新的ManagementObjectSearcher(查询);
foreach(类型()的searcher.Get()中的var envVar)
{
WriteLine(“变量:{0},值={1}”,
envVar[“名称”]、envVar[“变量值”]);
}
您最好在此处使用ManagementBaseObject
。Get()
方法返回一个包含ManagementBaseObject
派生类型的(非泛型),包括ManagementObject
和ManagementClass
第一个版本可能适用于您的特定查询,但通常您可能会得到无效的强制转换异常
如果您只需要考虑类型<代码>管理对象< /代码>的对象,您可以考虑以下版本:
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"]);
}
var query=new SelectQuery(“Win32_环境”);
var searcher=新的ManagementObjectSearcher(查询);
foreach(类型()的searcher.Get()中的var envVar)
{
WriteLine(“变量:{0},值={1}”,
envVar[“名称”]、envVar[“变量值”]);
}
在这种特殊情况下,没有区别
ManagementObjectSearcher.Get()
方法返回一个值,该值是的集合。这意味着集合可以包含类型为ManagementBaseObject
或从ManagementBaseObject
派生的任何类型的实例
但是,ManagementBaseObject
被设计为基类,这意味着在现实中,它不会被实例化,而是它的子类将被实例化。请注意,这只是一个约定,并不是由语言或框架强制执行的
此外,由于框架中唯一(直接)继承ManagementBaseObject
的类是,Get()
有效地返回ManagementObject
实例的集合。请注意,这只是当前的情况,没有任何东西阻止创建额外的ManagementBaseObject
继承器
因此,有了所有提到的注意事项,这意味着,如果只使用基类中定义的属性(而不是重写的),则可以以任何一种方式进行迭代,代码的行为将完全相同。在代码中,您只使用了,它实际上是在ManagementBaseObject
类中定义的,而不是重写的
如果您想要一个在一个循环中失败而在另一个循环中工作的代码示例,可以尝试在ManagementObject
上定义的任何属性,例如:
在这种特殊情况下,没有区别
ManagementObjectSearcher.Get()
方法返回一个值,该值是的集合。这意味着集合可以包含类型为ManagementBaseObject
或从ManagementBaseObject
派生的任何类型的实例
但是,ManagementBaseObject
被设计为基类,这意味着在现实中,它不会被实例化,而是它的子类将被实例化。请注意,这只是一个约定,并不是由语言或框架强制执行的
此外,由于框架中唯一(直接)继承ManagementBaseObject
的类是,Get()
有效地返回ManagementObject
实例的集合。请注意,这只是当前的情况,没有任何东西阻止创建额外的ManagementBaseObject
继承器
因此,有了所有提到的注意事项,这意味着,如果只使用基类中定义的属性(而不是重写的),则可以以任何一种方式进行迭代,代码的行为将完全相同。在代码中,您只使用了,它实际上是在ManagementBaseObject
类中定义的,而不是重写的
如果您想要一个在一个循环中失败而在另一个循环中工作的代码示例,可以尝试在ManagementObject
上定义的任何属性,例如:
但是请注意,使用
ManagementObject
的第一个版本之所以有效,是因为目前没有从ManagementBaseObject
派生的其他类型。Get()
方法的契约并不能保证这一点。添加了更有力的措辞来强调这一事实。虽然我怀疑这些类的设计是否会改变(它们已经存在),但使用这些代码意味着依赖于未经证实和不受支持的假设,使用ManagementObject
的第一个版本之所以有效,是因为目前没有从ManagementBaseObject
派生的其他类型。Get()
方法的契约并不能保证这一点。添加了更有力的措辞来强调这一事实。虽然我怀疑这些类的设计是否会改变(它们已经存在),但使用这些代码意味着依赖于未经证实和不受支持的假设。
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