如何检查PropertyDataCollection中是否存在一个值?

3
我有一个类,使用WMI从服务器收集信息。问题在于,某些版本的Windows似乎具有不同的可用/缺失属性,我无法找到一种方法来检查集合以查看值是否存在,然后再尝试访问它们的值。
明确一点,我已经发现可以通过使用wmiSingle.Properties.GetEnumerator()循环遍历整个集合并检查每个属性名称的值 - 但肯定有更好的方法。对吧?
ManagementScope wmiScope = new ManagementScope("\\\\MyLaptop\\root\\cimv2");
ObjectQuery wmiVolumeQuery = new System.Management.ObjectQuery("SELECT * FROM Win32_Processor");

using (ManagementObjectSearcher wmiObjectSearcher = new ManagementObjectSearcher(wmiScope, wmiVolumeQuery))
{
    using (ManagementObjectCollection wmiMany = wmiObjectSearcher.Get())
    {
        foreach (ManagementObject wmiSingle in wmiMany)
        {
            Console.WriteLine(wmiSingle["Name"]);

            //This line will throw an exception. How do I test to see if
            //  "SomeProperty" exists before attempting to access the value?
            //Console.WriteLine(wmiSingle["SomeProperty"]);
            object somePropertyValue = wmiSingle.GetPropertyValue("SomeProperty");
        }
    }
}
2个回答

8
我认为唯一的检查方法是遍历属性。
foreach (var prop in wmiSingle.Properties)
{
    if(prop.Name == "SomeProperty")
    { /* do something */ }        
}

您也可以通过捕获异常来实现 - 就像这样。
public static class Extensions
{
    public static object TryGetProperty(this System.Management.ManagementObject wmiObj, string propertyName)
    {
        object retval;
        try
        {
            retval = wmiObj.GetPropertyValue(propertyName);
        }
        catch (System.Management.ManagementException ex)
        {
            retval = null;
        }
        return retval;
    }
}

故意/有意诱发异常通常不是高效的做法;但是,遍历整个集合查找单个属性也同样不高效。


1
我相信你是对的,但我希望你是错的。我会再等一天,然后接受。 - NTDLS

4

在您的特定情况下,我建议将所有属性名称存储在HashSet中,并根据此进行检查。这样非常快速。 特别是如果您在程序生命周期内要进行多次检查。

HashSet<string> KnownProperties = new HashSet<string>() { };

然后通过对属性进行迭代,将其填充。

foreach (PropertyData prop in mo.Properties)
{
     KnownProperties.Add(prop.Name);
}

现在你可以非常快地获取值(我进行了测试,100次迭代得到60ticks = 60ns!)

string Value = KnownProperties.Contains(PropertyName) ? mo[PropertyName].ToString() : "";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接