Windows环境下获取WMI类时枚举器代码报错,求助解决
问题分析与解决方案
看起来你碰到的是编译错误,核心问题出在对类和实例的误用上,咱们一步步来理清楚:
错误根源
你出错的这行代码:
using (PropertyDataCollection.PropertyDataEnumerator enumerator2 = ManagementClass.Properties.GetEnumerator())
这里的ManagementClass是类的名称,但Properties是实例属性——必须通过具体的ManagementClass对象实例才能访问,不能直接用类名调用。
而在你的循环里,已经有一个现成的实例变量managementClass(就是循环声明里foreach (ManagementClass managementClass in ...)这个小写开头的变量),你需要用这个实例来获取属性集合。
修正后的关键代码
把错误行替换成:
using (PropertyDataCollection.PropertyDataEnumerator enumerator2 = managementClass.Properties.GetEnumerator())
另外,我还注意到你代码里有一行完全冗余的代码:
new ManagementScope(new ManagementObject(managementScope, path, options2).Path, options);
这行创建了新的ManagementScope对象但没有赋值给任何变量,相当于做了无用功,建议删掉它来简化代码。
完整修正后的核心循环段
foreach (ManagementClass managementClass in from ManagementClass currentClass in managementObjectSearcher.Get() orderby currentClass.ClassPath.ClassName select currentClass) { bool flag = false; using (PropertyDataCollection.PropertyDataEnumerator enumerator2 = managementClass.Properties.GetEnumerator()) { while (enumerator2.MoveNext()) { if (enumerator2.Current.Type == CimType.String) { flag = true; } } } if (flag) { WMIClass wmiclass = new WMIClass(managementClass); ListViewItem listViewItem = new ListViewItem { Name = wmiclass.DisplayName, Text = wmiclass.DisplayName, ToolTipText = wmiclass.Description, Tag = wmiclass }; listViewItem.SubItems.Add(wmiclass.Description); items.Add(listViewItem); } }
额外小提示
如果对C#的类和实例概念不太熟悉,可以记住这个简单规则:
- 类名(比如
ManagementClass)一般用来创建实例、访问静态成员 - 实例变量(比如循环里的
managementClass)才用来访问实例专属的成员(比如Properties、实例方法等)
这样修改后,你的代码应该就能正常编译运行了。
内容的提问来源于stack exchange,提问作者New Rolong
相关产品推荐
相关产品推荐

