[英]C# Error - Namespaces ManagementClass, ManagementObject, and ManagementObjectCollection could not be found
[英]C# Accessing management objects in ManagementObjectCollection
我試圖在不使用foreach語句的情況下訪問ManagementObjectCollection中的ManagementObjects,也許我錯過了一些但我無法弄清楚如何做到這一點,我需要做類似以下的事情:
ManagementObjectSearcher query = new ManagementObjectSearcher(
"select Name, CurrentClockSpeed from Win32_Processor");
ManagementObjectCollection queryCollection = query.Get();
ManagementObject mo = queryCollection[0];
ManagementObjectCollection實現IEnumerable或ICollection,因此要么必須通過IEnumerable(即foreach)迭代它,要么通過ICollection復制到數組。
但是因為它支持IEnumerable,所以你可以使用Linq:
ManagementObject mo = queryCollection.OfType<ManagementObject>().FirstOrDefault()
OfType<ManagementObject>
是必需的,因為ManagementObjectCollection支持IEnumerable而不支持IE的IEnumerable 。
您不能直接從ManagementObjectCollection(也不是整數索引器)調用linq。 你必須先把它投射到IEnumerable:
var queryCollection = from ManagementObject x in query.Get()
select x;
var manObj = queryCollection.FirstOrDefault();
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");
}
要么
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");
}
你可能錯過了演員:
ManagementObject mo = (ManagementObject)queryCollection[0];
...因為我認為ManagementObjectCollection不是通用的(因此沒有類型化的索引器。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.