10
votes

C # Accédant à des objets de gestion dans ManagementObjectCollection

J'essaie d'accéder à la gestion des assurances dans ManagementObjectCollection sans utiliser de déclaration de foresach, peut-être que je manque quelque chose, mais je ne peux pas comprendre comment le faire, je dois faire quelque chose comme ce qui suit:

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

ManagementObjectCollection queryCollection = query.Get();

ManagementObject mo = queryCollection[0];


0 commentaires

4 Réponses :


13
votes

GestionObjectCollection implémente iEnumérable ou icollection, donc soit Vous devez iTER ITER ITER via iEnumerable (c'est-à-dire pourach) ou copier un tableau via l'ICollection.

Cependant, comme il prend en charge IEnumerable, vous pouvez utiliser LINQ: P>

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


3 commentaires

Je devais ajouter detype ... GestionObject Mo = QueryCollection.Oftype (). Premier ();


Je ne vois pas firstordfault () dans GestionObject soit, seul detype (). FirstAdefault () a travaillé pour moi


Pour quiconque est aussi confus que moi, il y a une faute de frappe dans cette réponse. Il devrait lire: GestionObject Mo = QueryCollection.Oftype (). FirstArdefault ()



-2
votes

Vous manquez probablement le casting:

ManagementObject mo = (ManagementObject)queryCollection[0];


1 commentaires

-1 Pour une erreur d'île, ne peut pas accéder à la gestionObjectCollection avec l'indexation du tableau. Voici une capture d'écran de mon erreur: i.imgur.com/fbvxea2.png



4
votes

Vous ne pouvez pas appeler directement LINQ de GestionObjectCollection (ni un index entier). Vous devez la jeter à Ienumerable en premier:

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

var manObj = queryCollection.FirstOrDefault();


0 commentaires

1
votes

GestionObjectCollection ne met pas implémente les indexeurs, mais oui, vous pouvez votre fonction d'extension de débutFault si vous utilisez LINQ mais les geeks qui utilisent .NET 3 ou plus tôt (comme moi toujours fonctionnant sur 1.1) peuvent utiliser le code suivant, c'est une manière standard de Obtenir un premier article de n'importe quelle collection Mise en œuvre interface iEnumerable.

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");
 }


0 commentaires