Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Можно ли wmi список собрать в едино?

#c_sharp #wmi


Пытаюсь собрать всё максимально компактно.

Приведу пример:

private readonly static ManagementObjectSearcher Processor = new 
ManagementObjectSearcher(@"root\CIMV2", "SELECT * FROM Win32_Processor");

private readonly static ManagementObjectSearcher OperatingSys = new 
ManagementObjectSearcher(@"root\CIMV2", "SELECT * FROM Win32_OperatingSystem");

ManagementObjectCollection ProcG = Processor.Get();
foreach (var cr in ProcG)
{
   stringbuilder.AppendFormat(cr["Name"]).ToString())
}

ManagementObjectCollection OperaSys = OperatingSys.Get();
foreach (var z in OperaSys)
{
  stringbuilder.AppendFormat(z["SerialNumber"].ToString());
}


И.т.д .. Но код вышел очень длинным))

Можно ли как-нибудь объединить их?
Допустим в List? или вообще что лучше использовать?

Думал сделать так для начало как-то:

var collectionWmi = 
{ 
 "SELECT * FROM Win32_Processor", 
 "SELECT * FROM Win32_OperatingSystem",}; 


и.т.д и уже с ним работать, но я в сомнениях)

Что посоветуете?
    


Ответы

Ответ 1



Когда-то давно в институте нам вдалбливали на лабораторных работах по информатике, что любую программу можно разделить на этап сбора данных (чтение пользовательского ввода), её обработку и вывод на экран данных. Если бы у вас не было бы такого маниакального желания смешать все эти фазы в одну, чтобы сразу и читать и загонять в стринг билдер -- то вы бы увидели много вариантов по объединению похожих чтений полей. А вы думаете в терминах строк. Соберите данные в класс и представьте, что у вас не один формат, а много форматов и отделите в голове СБОР инфы от ФОРМАТИРОВАНИЯ и ВЫВОДА. Я бы сначала бы объявил класс Machine и сказал бы что у него есть prop Processors[] и остальная ваша портянка свойств. Не строки, а строгие типы. Потом бы взялся за упрощение сбора информации. И отдельно бы думал о выводе информации в нужных видах. Вы например не думаете, что у вас на одной закладке приложения могут показываться лишь данные о процессорах, а на другой -- об оперативке? И что каждый раз нужно лишь часть инфы выводить, а не сгребать всё попало в строки. Вы думаете в терминах процедурных языков, у вас по сути одна длиннющая функция. А разбить это на десяток классов, у каждого из которых будет по 10 строк кода, каждый из которых инфу по своему свойству заполняет. Процессор - о процессоре, ОС - про ОС. Увидел бы, что каждый лезет в ManagementObjectSearcher и выполняет по сути типовые операции, вынес бы это в базовый класс... Подскажите, на данный момент я использую stringbuilderи собираю все данные через strbuild.AppendFormat("",path);, Думаю за место билдера использовать List он может добавлять такие же строки через запятую? Вы по-прежнему не можете отделить в голове способ хранения информации от формата вывода. Хранить строки можно разными способами, ничего не мешает использовать List, можно хранить в Array, можно в свойствах класса. Причём вы, проектируя своё приложение вы можете как скрывать детали реализации, так и наоборот активно использовать знание о способе хранения. А вывод информации через запятую -- это только один формат, который совершенно не зависит от того, что у вас внутри - список или массив. В конкретной реализации у вас и для списка и для массива будет одно и то же: var options = new[] { "first", "second", "third"}; var display = string.Join(",", options); Тут два момента. Во-первых, замена стринг билдера на джойн ничего не меняет концептуально: меняете шило на мыло, а архитектура как была "трудоноподдерживаемый спагетти-код" -- так и осталась. Во-вторых, стринг билдер лучше, чем склейка строк: вряд ли вас интересуют копейки производительности (у вас в приложении есть множество мест, которые на порядки больше съедают ресурсов), но всё же если вы вспомните, что строки в c# -- неизменяемые объекты и сто раз делая склеивание строк вы сто раз создаёте новые объекты, в которые помещаете данные. В общем-то стринг билдер как раз и нужен в случаях, подобных вашему. И ещё. Какая разница, как форматировать строки? Может быть вы завтра захотите свою программу сделать веб-приложением -- и не будет у вас ни стринг билдера, ни склейки Join'ом -- а будет у вас Razor и он будет строить
    список из вашего List'а.

    Ответ 2



    Я бы каждый WMI запрос обернул бы собственный тип. Получится, что в коде не будет каши и будет соблюден принцип "разделяй и властвуй". Так же результаты каждого запроса будут типизированны, так как вы загоните их в собственный тип. Затем бы переопределил метод ToString(), что бы все возвращалось в виде название поля-значение. А уже вот эти маленькие классы объединил бы в более общую сущность SystemInfo, где бы были перечислены эти типы. В SystemInfo добавил бы метод GetReport(), который бы вызвал ToString() у каждого поля и вернул бы единую строку.

Комментариев нет:

Отправить комментарий