foreach(stringhinhierarchy)// заходим в иерархию через цикл и проверяем каждую строку
{
if(h==propertyName)// если строка равна передаваемому полю, то ...
{
varfield=t.GetType().GetField(h);// получаем тип параметризированного класса и ищем поле "h"
if(field==null)// если оно равно null(то есть его нету)
{
returnfalse;// возвращаем false
}
stringvalue=field.GetValue(t).ToString();// если такая ветка уже есть, то достаем её значение(строку)в переменную value
if(!hasValue(current,value))current.Add(value);// Если значение не существует в текущей ветке, добавляем его
TreeNodeelem=null;// создаем новый объект узла
foreach(TreeNodechildincurrent)// задаем цикл, в котором просматриваем все подветки текущей ветки
{
if(child.Text==value)// если подветка с таким названием есть, то ...
{
elem=child;// то переходим в эту подветку
break;// выходим из цикла
}
}
if(elem!=null)current=elem.Nodes;// если нашлась подветка с таким названием, то текущая коллекция узлов ставовится коллецией узлов подветки
}
else// если строка не равна передаваемому полю, то ...
{
if(!hasValue(current,h))current.Add(h);// проверяем, есть ли в текущей коллекции узлов ветка с таким значением, если нету, то добавляем новый узел с названием поля "h"
TreeNodeelem=null;// создаем новый объект узла
foreach(TreeNodechildincurrent)// задаем цикл, в котором просматриваем все подветки текущей ветки
{
if(child.Text==h)// если подветка с названием равным "h" есть, то ...
{
elem=child;// мы спускаемся по иерархии в эту подветку
break;// выходим из этого цикла
}
}
if(elem!=null)current=elem.Nodes;// если нашлась подветка с названием "h", то переменная, хранящая текущую коллекцию узлов, получает коллекцию подветки