c#
  • collections
  • enumeration
  • 2014-02-11 3 views 0 likes 
    0

    Использование этой функции:Доступ один объект из коллекции объекта

    public bool CheckCallerStatus(string stConsumerName) 
        { 
         SelectQuery selectQuery = new SelectQuery("select ExecutablePath from Win32_Process where name='" + 
           stConsumerName + "'"); 
         using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery)) 
         { 
          ManagementObjectCollection moc = searcher.Get(); 
          if (moc.Count > 1) 
          { 
           return true; // OK process is running 
          } 
          return false; 
         } 
        } 
    

    я могу проверить, является ли процесс, принятый в качестве stConsumerName, является активным процессом (я использую moc.Count > 1 и не moc.Count > 0, потому что я звоню из процесса, который я наблюдаю, и пытаюсь увидеть, есть ли другие активные процессы помимо него). Каждый экземпляр моего процесса хранится как объект в ManagementObjectCollection moc.

    Теперь я хочу получить путь к процессу. Я считаю, что эта информация хранится в объекте в moc и простой foreach, например, так:

    string stFilePath = Empty.String; 
    foreach (ManagementObject process in moc) 
    { 
        stFilePath = process["ExecutablePath"].ToString(); 
    } 
    

    возвратит path сторицей.

    Как вы можете видеть, что я храню значение process["ExecutablePath"] к string (а не к List или array или сконвертировано), потому что я только заботиться о пути первого процесса (я предполагаю, что все процессы, возвращаемые в moc - мой процесс [имя достаточно уникально]).

    Мой Вопрос: Как получить доступ к любому один объект в ManagementObjectCollection? Такое, что я могу установить stFilePath = process["ExecutablePath"]; Так как moc не поддерживает индексацию, moc.First() или moc.Single() не поможет.

    И связанный с ним вопрос: У ManagementObjectClass есть метод GetEnumerable(). Я просмотрел (и, конечно, в MSDN Reference), и я действительно не понимаю. GetEnumerable()вернуть индексированную коллекцию?

    +0

    Можете ли вы использовать выражение'break 'внутри'foreach'? –

    +1

    Использование 'foreach' для получения одного элемента, а затем с использованием' break' - не очень хорошая идея, так как 'foreach' используется для повторения нескольких элементов. Это может быть немного запутанным при попытке сохранить код позже. – Steve

    +0

    Итак, 'ManagementObjectCollection' реализует не-общую версию интерфейса' IEnumerable'? – Grzenio

    ответ

    2

    Вы можете получить первый объект usig LINQ: moc.First(), или если вы хотите проверить наличие только одного объекта moc.Single().

    EDIT: Если ManagementObjectCollection не реализует IEnumerable<ManagementObject> чем выше методы расширения действительно не реализованы (это не такой же, как индексатор, хотя). Вы можете добиться того же самого результата вручную:

    var enumerator = moc.GetEnumerator(); 
    if(!enumerator.MoveNext()) throw new Exception("No elements"); 
    ManagementObject obj = (ManagementObject) enumerator.Current; 
    string stFilePath = obj["ExecutablePath"]; 
    
    +0

    Как насчет элемента [« Путь »]? Например: 'moc.First() [" Path "]'? – seebiscuit

    +0

    Если тип 'moc.First()' возвращает ('ManagementObject') поддерживает индексирование (' [] '), это будет работать. – Steve

    +0

    @Grzenio это не работает. 'moc' не поддерживает индексирование. Это корень проблемы. – seebiscuit

    Смежные вопросы