GrooverFromHolland Ответов: 2

Как проверить наличие null в этой ситуации?


Всем привет,

Как проверить, является ли ManagementObject mo2 нулевым в этом методе:

static string[] GetUsbcomDevices()
      {
          ManagementObjectSearcher searcher2 = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity");
          List<string> list = searcher2.Get().Cast<ManagementObject>().Select(mo2 => mo2["Name"].ToString()).Where(name => name.Contains("(COM")).ToList();
          string[] usbDevices = list.Distinct().OrderBy(s => s).ToArray();
          return usbDevices;
      }


Спасибо,
Канавка

GrooverFromHolland

С помощью OriginalGriff я пришел к рабочему решению, которое я опубликую, чтобы другие могли получить прибыль,

Канавка

2 Ответов

Рейтинг:
8

GrooverFromHolland

это и есть решение проблемы:

static string[] GetUsbcomDevices()
       {
           List<ManagementObject> listObj = new List<ManagementObject>();
           List<string> usbSerial = new List<string>();
           try
           {
               string query = "SELECT * FROM Win32_PnPEntity WHERE ConfigManagerErrorCode = 0";
               ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
               listObj = searcher.Get().Cast<ManagementObject>().ToList();
               searcher.Dispose();
           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.ToString());
               usbSerial = new List<string>();
           }
           foreach (ManagementObject obj in listObj)
           {
               var targetObj = obj["Caption"];
               if (targetObj != null)
               {
                   string caption = targetObj.ToString();
                   if (caption.Contains("(COM"))
                   {
                       string name = caption.Substring(caption.LastIndexOf("(COM")).
                                                       Replace("(", string.Empty).
                                                       Replace(")", string.Empty);
                       usbSerial.Add(name);
                   }
               }
           }
           string[] usbDevices = usbSerial.Distinct().OrderBy(s => s).ToArray();
           return usbDevices;
       }


Канавка


Рейтинг:
17

OriginalGriff

Если поисковик содержит нули, то вы можете игнорировать их довольно легко:

List<string> list = searcher2.Get().Where(m => m != null).Cast<ManagementObject>().Select(mo2 => mo2["Name"].ToString()).Where(name => name.Contains("(COM")).ToList();

Но вам не нужно приводить коллекцию к ManagementObjects, так как метод Get уже возвращает их коллекцию: MSDN[^]


GrooverFromHolland

Если я проверяю значение null после searcher2.Get(), то получаю ошибку: ManagementObjectCollection не содержит определения Where.
Если я проверяю значение null после приведения<<managementobject>>() mo2 все еще является нулевым.

Канавка

OriginalGriff

Извините, вы правы: ManagementObjectCollection реализует IEnumeable, но не универсальную версию, необходимую для методов Linq. Вам нужен актерский состав, чтобы получить его в общую коллекцию.

Но если он проходит через приведение, то он все равно не является нулевым ( если бы это было так, вы бы получили исключение "недопустимое приведение").
Это означает, что не "mo2" является нулевым, а индекс "Name" возвращает null.
Вы можете доказать это очень легко:
...Бросание&ЛТ;managementobject и GT;().Выберите(мо2 =&ГТ; (мо2["наименование"] ?? "").Метод toString()).Где(...
Уберут исключение - и, наверное, все пункты!

И быстрая проверка на MSDN:
https://msdn.microsoft.com/en-us/library/system.management.managementobject_properties%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
Говорит, что нет никакого свойства "Name" для объекта ManagementObject или для его базовых классов.

GrooverFromHolland

Вы абсолютно правы, я попробую другой подход, чтобы получить список USB-последовательных устройств.

Спасибо Вам за ваши усилия,

Канавка

OriginalGriff

Всегда пожалуйста!