从对象集合中访问一个对象

时间:2014-02-11 16:53:56

标签: c# collections enumeration

使用此功能:

 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(而不是Listarray或某些地方),因为我只是关心第一个过程的路径(我假设moc中返回的所有过程都是我的过程[名称足够独特])。

我的问题:如何访问ManagementObjectCollection中的任何一个对象?这样我可以设置stFilePath = process["ExecutablePath"];由于moc不支持索引,moc.First()moc.Single()不会提供帮助。

以及相关问题:ManagementObjectClass有一个方法GetEnumerable()。我环顾四周(当然还有MSDN参考资料)我并没有真正理解它。 GetEnumerable() 是否会返回索引集合?

1 个答案:

答案 0 :(得分:2)

您可以使用LINQ:moc.First()获取第一个对象,或者如果要验证只有一个对象使用moc.Single()

编辑:如果ManagementObjectCollection未实现IEnumerable<ManagementObject>,则上述扩展方法确实没有实现(但与索引器相同)。你可以手动实现同样的目的:

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