C#访问ManagementObjectCollection中的管理对象

时间:2010-08-27 02:15:04

标签: c# wmi

我正在尝试在不使用foreach语句的情况下访问ManagementObjectCollection中的ManagementObjects,也许我错过了一些但我无法弄清楚如何做到这一点,我需要做类似以下的事情:

ManagementObjectSearcher query = new ManagementObjectSearcher(
     "select Name, CurrentClockSpeed from Win32_Processor");

ManagementObjectCollection queryCollection = query.Get();

ManagementObject mo = queryCollection[0];

4 个答案:

答案 0 :(得分:8)

ManagementObjectCollection实现IEnumerable或ICollection,因此要么必须通过IEnumerable(即foreach)迭代它,要么通过ICollection复制到数组。

但是因为它支持IEnumerable,所以你可以使用Linq:

ManagementObject mo = queryCollection.OfType<ManagementObject>().FirstOrDefault()

OfType<ManagementObject>是必需的,因为ManagementObjectCollection支持IEnumerable但不支持IEnumerable of T

答案 1 :(得分:3)

您不能直接从ManagementObjectCollection(也不是整数索引器)调用linq。 你必须先把它投射到IEnumerable:

var queryCollection = from ManagementObject x in query.Get()
                      select x;

var manObj = queryCollection.FirstOrDefault();

答案 2 :(得分:1)

ManagementObjectCollection没有实现Indexers,但是如果你使用linq,你可以使用FirstOrDefault扩展函数但是使用.net 3或更早版本的极客(比如我仍在使用1.1)可以使用下面的代码,它是标准的方式从任何集合中获取第一个项目实现IEnumerable接口。

//TODO: Do the Null and Count Check before following lines
IEnumerator enumerator = collection.GetEnumerator();
enumerator.MoveNext();
ManagementObject mo = (ManagementObject)enumerator.Current;

以下是从任何索引检索ManagementObject的两种不同方法

private ManagementObject GetItem(ManagementObjectCollection collection, int index)
{
            //TODO: do null handling 

            IEnumerator enumerator = collection.GetEnumerator();

            int currentIndex = 0;
            while (enumerator.MoveNext())
            {
                if (currentIndex == index)
                {
                    return enumerator.Current as ManagementObject;
                }

                currentIndex++;
            }

            throw new ArgumentOutOfRangeException("Index out of range");
 }

OR

private ManagementObject GetItem(ManagementObjectCollection collection, int index)
{
            //TODO: do null handling 

            int currentIndex = 0;
            foreach (ManagementObject mo in collection)
            {
                if (currentIndex == index)
                {
                    return mo;
                }

                currentIndex++;
            }

            throw new ArgumentOutOfRangeException("Index out of range");
 }

答案 3 :(得分:-1)

你可能错过了演员:

ManagementObject mo = (ManagementObject)queryCollection[0];

...因为我认为ManagementObjectCollection不是通用的(因此没有类型化的索引器。)