Windows Management Instrumentation. Опрос свойств, методов и описателей. Разработка компонента WMIControl, страница 19

"Win32_F", "Win32_I", "Win32_L", "Win32_M", "Win32_N", "Win32_O", "Win32_P",

"Win32_R", "Win32_Ser", "Win32_Soft", "Win32_System", "Win32_S", "Win32_T",

"Win32_U", "Win32_V", "Win32_W", "Win32", "Workflow", "WS", "Wi", "Wo", "Xe", "XEvent",

"__Namespace", "__Class", "__Instance", "__" };

public static void Classify(string name, ref TreeNode node)

{

Globals.Classify(letters, name, ref node);

Globals.Classify(prefixes, name, ref node);

}

}

public static class MyEvents

{

static string[] prefixes = {

"HD", "Kernel", "MSFT", "MSNdis", "MS", "Port", "Process", "Reg",

"Win32", "Workflow", "__Namespace", "__Class", "__Instance", "__" };

public static void Classify(string name, ref TreeNode node)

{

Globals.Classify(prefixes, name, ref node);

}

}

public static class MyOther

{

static string[] letters = {

"A", "B", "C", "D", "E", "F", "H", "I", "K", "L",

"M", "O", "P", "R", "S", "T", "U", "W" };

static string[] prefixes = {

"Ac", "Al", "Cs", "Di", "Dr", "Fi", "Get", "Hd", "He", "HNet",

"Id", "Im", "ISCSI", "Is", "Mm", "MSNdis", "Mp", "MSi", "MSS", "MSW",

"MSF", "MSN", "MS1", "MSP", "MST", "MSK", "MSM", "MS_", "MS", "Mu", "Pa", "Pe", "Po",

"Process", "Re", "Rs", "Se", "Sy", "Tc", "Th", "Tp", "Ts", "Ud", "Um",

"Vs", "Win32", "Wh", "Wm", "__" };

public static void Classify(string name, ref TreeNode node)

{

Globals.Classify(letters, name, ref node);

Globals.Classify(prefixes, name, ref node);

}

}

}

Сначала все множество разбивается на классы эквивалентности по первой букве имени класса. Далее полученные подмножества разбиваются по признакам, которые, были выявлены в ходе анализа имен всего множества классов. Это результат длительной и неблагодарной работы. Надеюсь, тем не менее, что выявленные признаки обозначают некоторую общность классов. Здесь надо еще поработать.

Методы Classify и FindOrAddNode, реализующие алгоритм разбиения (классификации) и создания нового узла дерева классов, я решил вынести в класс Globals, так как они имеет обобщенную функциональность. Приведем весь код этого класса.

using System;

using System.Windows.Forms;

using System.IO;

namespace Library

{

public class Globals

{

public static void Classify(string[] prefixes, string name, ref TreeNode node)

{

bool found = false;

foreach (string s in prefixes)

{

found = name.StartsWith(s, StringComparison.InvariantCultureIgnoreCase);

if (found)

{

FindOrAddNode(s, ref node);

break;

}

}

}

public static void FindOrAddNode(string s, ref TreeNode node)

{

int pos = node.Nodes.IndexOfKey(s);

node = pos == -1 ?

node.Nodes.Add(s, s, 3, 2) :

node.Nodes[pos];

}

public static string FindFolder(string name)

{

string dir = Application.StartupPath;

for (char slash = '\\'; dir != null; dir = Path.GetDirectoryName(dir))

{

string res = dir.TrimEnd(slash) + slash + name;

if (Directory.Exists(res))

return res + slash;

}

return null;

}

}

}

Определение свойств, методов и описателей