#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() у каждого поля и вернул бы единую строку.
Комментариев нет:
Отправить комментарий