C# 从对象集合访问一个对象
使用此功能:C# 从对象集合访问一个对象,c#,collections,enumeration,C#,Collections,Enumeration,使用此功能: public bool CheckCallerStatus(string stConsumerName) { SelectQuery selectQuery = new SelectQuery("select ExecutablePath from Win32_Process where name='" + stConsumerName + "'"); using (ManagementObjectSearc
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();
}
将返回路径
如您所见,我将进程[“ExecutablePath”]
的值存储到字符串中(而不是存储到列表或数组或诸如此类的文件中),因为我只关心第一个进程的路径(我假设moc
中返回的所有进程都是我的进程[名称足够独特])
我的问题是:如何访问ManagementObjectCollection
中的任何一个对象?这样我就可以设置stFilePath=process[“ExecutablePath”]
由于moc
不支持索引,moc.First()
或moc.Single()
将不起作用
和一个相关问题:ManagementObjectClass有一个方法GetEnumerable()
。我环顾四周(当然还有MSDN参考资料),但我真的不明白。GetEnumerable()
是否返回索引集合 可以使用LINQ:moc.first()
获取第一个对象,或者如果要验证只有一个对象,请使用moc.Single()
编辑:如果ManagementObjectCollection
未实现IEnumerable
,则上述扩展方法确实未实现(但这与indexer不同)。您可以通过以下方式手动实现相同的目标:
var enumerator = moc.GetEnumerator();
if(!enumerator.MoveNext()) throw new Exception("No elements");
ManagementObject obj = (ManagementObject) enumerator.Current;
string stFilePath = obj["ExecutablePath"];
你能在“foreach”中使用“break语句”吗?使用foreach
获取一个项目,然后使用break
不是一个好主意,因为foreach
用于迭代多个项目。在以后尝试维护代码时,这可能会有点混淆。ManagementObjectCollection
是否实现了IEnumerable
接口的非通用版本?@Grzenio看起来是这样的。特别是它实现了显式接口:IEnumerable.GetEnumerator
(返回一个迭代ManagementObjectCollection的IEnumerator。)[“Path”]元素呢?如下所示:moc.First()[“Path”]
?如果moc.First()
返回的类型(ManagementObject
)支持索引([]
),则可以工作。@Grzenio它不工作<代码>moc
不支持索引。这就是问题的根源。你能在moc中使用.ToList()吗?@lucasabiledebob-Nope:(