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

228
27 мая 2017, 15:13

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

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

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<string>? или вообще что лучше использовать?

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

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

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

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

Answer 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 и он будет строить <ul> список из вашего List'а.

Answer 2

Я бы каждый WMI запрос обернул бы собственный тип.

Получится, что в коде не будет каши и будет соблюден принцип "разделяй и властвуй".

Так же результаты каждого запроса будут типизированны, так как вы загоните их в собственный тип.

Затем бы переопределил метод ToString(), что бы все возвращалось в виде название поля-значение.

А уже вот эти маленькие классы объединил бы в более общую сущность SystemInfo, где бы были перечислены эти типы.

В SystemInfo добавил бы метод GetReport(), который бы вызвал ToString() у каждого поля и вернул бы единую строку.

READ ALSO
ASP .NET, Visual Studio Online [требует правки]

ASP .NET, Visual Studio Online [требует правки]

How to create custom task and add it to Build Process so that after build this task sends my artefacts to my e-mail?

210
Изменить высоту ячейки таблицы

Изменить высоту ячейки таблицы

Как сделать, чтобы высота ячейки автоматически увеличивалась в зависимости от размера контента внутри неё?

235
Удалить слово из ListBox

Удалить слово из ListBox

Как при нажатии на этот Button удалить определенное слово из строки ListBox? Button вытягивает строку из ListBox и отправляет ее метод Find

476
SharpDX11 [DirectX11] рисование линии

SharpDX11 [DirectX11] рисование линии

Я в DirextX ноль, по этому нубский вопросКак мне рисовать линии в окне DirectX11 имея только классы:

364