Получение одного значения свойства из коллекции объектов


Исходный код

private static string identifier(string wmiClass, string wmiProperty)
            {
                string result = "";
                System.Management.ManagementClass mc =
            new System.Management.ManagementClass(wmiClass);
                System.Management.ManagementObjectCollection moc = mc.GetInstances();
                foreach (System.Management.ManagementObject mo in moc)
                {
                    //Only get the first one
                    if (result == "")
                    {
                        try
                        {
                            result = mo[wmiProperty].ToString();
                            break;
                        }
                        catch
                        {
                        }
                    }
                }
                return result;
            }

Что не так с этим кодом

Приходится прилагать усилия для того, чтобы понять алгоритм (вернуть значение заданное свойство из первого по списку объекта, у которого оно есть и непустое).

Сложность возникла из-за того, что проверка значения оторвана от получения значения, да ещё и опережает её.

В идеале для проверки следовало бы применить явный метод проверки наличия значения, однако я не знаю, существует ли такой.

Также в этом примере неудачно выбрано название метода identifier, так как он возвращает не идентификатор, а значение свойства. Возможно, значение свойства является идентификатором, но данной функции это не касается — она возвращает значение свойства.

Возможный вариант рефакторинга

private static string classPropValue(string wmiClass, string wmiProperty)
            {
                System.Management.ManagementClass mc =
            new System.Management.ManagementClass(wmiClass);
                System.Management.ManagementObjectCollection moc = mc.GetInstances();
                foreach (System.Management.ManagementObject mo in moc)
                {
                    try {
                        string result = mo[wmiProperty].ToString();
                        if (result != "") {
                            return result;
                        }
                    }
                    catch {}
                }
                return "";
            }