WMI を使用して Process 情報を取得する際に LINQ を使用しようとすると
ManagementObjectSearcher query1 = new ManagementObjectSearcher("SELECT * FROM Win32_Process");
ManagementObjectCollection queryCollection1 = query1.Get();
var query = from proc in queryCollection1 select proc;
foreach (var process in query)
{
…
}
エラー 1 ソース型 ‘System.Management.ManagementObjectCollection’ のクエリ パターンの実装が見つかりませんでした。’Select’ が見つかりません。範囲変数 ‘proc’ の型を明示的に指定してください。 C:\Users\uchukamen\Documents\Visual Studio 2008\Projects\WpfApplication6\WpfApplication6\Window1.xaml.cs 140 38 WpfApplication6
というエラーになる。
回避方法は、範囲変数 proc の型を明示的に指定するために、queryCollection1.Cast<ManagementObject>() としてあげるとうまくいった。うむむむむ・・・
ManagementObjectSearcher query1 = new ManagementObjectSearcher("SELECT * FROM Win32_Process");
ManagementObjectCollection queryCollection1 = query1.Get();
var query = from proc in queryCollection1.Cast<ManagementObject>() select proc;
foreach (var process in query)
{
Console.WriteLine(process["ProcessId"] + ":");
Console.WriteLine(process["Name"] + ":");
Console.WriteLine(process["KernelModeTime"] + ":");
Console.WriteLine(process["UserModeTime"] + ":");
}
——
もうちょっと見やすく?すると、IEnumerable<ManagementObject> にキャストしてくれるということ。
ManagementObjectSearcher query1 = new ManagementObjectSearcher("SELECT * FROM Win32_Process");
ManagementObjectCollection queryCollection1 = query1.Get();
IEnumerable<ManagementObject> procQuery = queryCollection1.Cast<ManagementObject>();
var procs = from proc in procQuery select proc;
foreach (var process in procs)
{
Console.WriteLine(process["ProcessId"] + ":");
Console.WriteLine(process["Name"] + ":");
Console.WriteLine(process["KernelModeTime"] + ":");
Console.WriteLine(process["UserModeTime"] + ":");
}