<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CEYNQXw4fCp7ImA9WhRUEEU.&quot;"><id>tag:blogger.com,1999:blog-7550093075906678978</id><updated>2012-01-20T21:56:30.234+04:00</updated><category term="debug" /><category term="flash" /><category term="cryptography" /><category term="tools" /><category term="javascript" /><category term="silverlight" /><category term="readit" /><category term="apple" /><category term="smalltalk" /><category term="aop" /><category term="wtf" /><category term="advanced" /><category term="algorithms" /><category term="t4" /><category term="validation" /><category term="ie" /><category term="prolog" /><category term="visual studio" /><category term="firefox" /><category term="objective-c" /><category term="system.web.routing" /><category term="trick" /><category term="haskell" /><category term="asp.net" /><category term="tdd" /><category term=".net" /><category term="md5" /><category term="beginner" /><title>Заметки на полях</title><subtitle type="html">Мой дядя самых честных правил программ исходники за так ...</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://andir-notes.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://andir-notes.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default?start-index=6&amp;max-results=5&amp;redirect=false&amp;v=2" /><author><name>Andir</name><uri>http://www.blogger.com/profile/04945404879829884954</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>5</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/AndirNotes" /><feedburner:info uri="andirnotes" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DUcMQ3c8eip7ImA9WhdWGUw.&quot;"><id>tag:blogger.com,1999:blog-7550093075906678978.post-4733853149963176736</id><published>2011-09-13T13:49:00.001+04:00</published><updated>2011-09-13T16:31:22.972+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-13T16:31:22.972+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="smalltalk" /><category scheme="http://www.blogger.com/atom/ns#" term="beginner" /><category scheme="http://www.blogger.com/atom/ns#" term="objective-c" /><category scheme="http://www.blogger.com/atom/ns#" term="apple" /><title>Мини-гайд по началам изучения Objective C</title><content type="html">&lt;p&gt;Опять же, собрано для себя.&lt;/p&gt;  &lt;h4&gt;Введение&lt;/h4&gt;  &lt;p&gt;Язык Objective C, на первый взгляд, очень простой, чтобы начать программировать – достаточно базового знания Cи и слышать что-нибудь про &lt;a href="http://ru.wikipedia.org/wiki/SmallTalk"&gt;SmallTalk&lt;/a&gt;, где вызов метода – это посылка сообщения.&lt;/p&gt;  &lt;p&gt;Для людей с бэкграундом любого обьектно-ориентированного языка все концепции очень быстро понимаются и изучаются методом практического программирования.&lt;/p&gt;  &lt;h4&gt;Инструменты&lt;/h4&gt;  &lt;p&gt;Как это не странно, но каких-либо удобных инструментов под платформу Windows для этого языка &lt;strike&gt;не существует&lt;/strike&gt; не найдено мной, к сожалению.&lt;/p&gt;  &lt;p&gt;Поэтому как обычно, пришлось брать стандартный GCC (с поддержкой Objective C) и MakeFile в руки. Для редактирования текстов и исполнения программ, я уже который год подряд использую прекрасный, хоть уже слегка и устаревший редактор Scite.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-hyb65sS4nkY/Tm8nFM6gUzI/AAAAAAAABqg/YVSnOic6yC0/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Скриншот: Редактор Scite и программа на Objective C" border="0" alt="Скриншот: Редактор Scite и программа на Objective C" src="http://lh6.ggpht.com/-k7Ma8c_b7bo/Tm8nGLZO5II/AAAAAAAABqk/nYABoeGeaj4/image_thumb%25255B1%25255D.png?imgmax=800" width="882" height="772" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Примечание: Официальную версию Scite можно взять &lt;/em&gt;&lt;a href="http://www.scintilla.org/SciTE.html"&gt;&lt;em&gt;тут&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Однако, самой подходящей версией Scite, сейчас, видимо является – &lt;/em&gt;&lt;a href="http://code.google.com/p/scite-ru/"&gt;&lt;em&gt;русская сборка&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, которая содержит ряд полезных дополнений к оригинальной версии и поддерживает скриптовый язык Lua.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;И далее, компилировать GCC с поддержкой Objective-C:&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Consolas"&gt;gcc.exe -x objective-c -lobjc -I$(OBJC_INC) -L$(OBJC_LIB) *.m $(OBJC_BASELIBS) -o Main.exe&lt;/font&gt;&lt;/p&gt;  &lt;h4&gt;Синтаксис&lt;/h4&gt;  &lt;p&gt;Ух, это просто сказка.&lt;/p&gt;  &lt;p&gt;По сути, вы можете взять любую Си-программу и откомпилировать её компилятором Objective C. Полная обратная совместимость.&lt;/p&gt;  &lt;p&gt;А всё дальнейшее – это расширения.&lt;/p&gt;  &lt;p&gt;По сути, их несколько: новые ключевые слова, которые начинаются с символа ‘@’ (&lt;a href="http://ru.wikipedia.org/wiki/@"&gt;коммерческое At&lt;/a&gt;), посылка сообщения, обрамляемое квадратными скобками, и &lt;em&gt;всё&lt;/em&gt;. Остальное делает рантайм – то есть библиотеки.&lt;/p&gt;  &lt;p&gt;Например:&lt;/p&gt; &lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;p&gt;   &lt;pre class="csharpcode"&gt;#import &amp;lt;stdio.h&amp;gt;
#import &amp;lt;objc/Object.h&amp;gt;

@&lt;span class="kwrd"&gt;interface&lt;/span&gt; MyObject : Object
{
    &lt;span class="kwrd"&gt;int&lt;/span&gt; field;
}

-init;
-(&lt;span class="kwrd"&gt;void&lt;/span&gt;) Hello: (&lt;span class="kwrd"&gt;char&lt;/span&gt;*) s;

@end

@implementation MyObject

-init
{
    [super init];

    field = 5;
}

-(&lt;span class="kwrd"&gt;void&lt;/span&gt;) Hello: (&lt;span class="kwrd"&gt;char&lt;/span&gt;*) s
{
    printf(&lt;span class="str"&gt;&amp;quot;%s\n&amp;quot;&lt;/span&gt;, s);
}

@end

&lt;span class="kwrd"&gt;int&lt;/span&gt; main(&lt;span class="kwrd"&gt;void&lt;/span&gt;)
{
    MyObject* myObjectInstance = [[MyObject alloc] init];        
    
    [myObjectInstance Hello: &lt;span class="str"&gt;&amp;quot;Hello, World!&amp;quot;&lt;/span&gt;];
    
    [myObjectInstance free];
}&lt;/pre&gt;
  &lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;Разбираем, по очереди.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#import&lt;/strong&gt; – замена стандартного, и набившего всем C++-сникам оскомину, &lt;strong&gt;#include&lt;/strong&gt;, – отличие с том, что #import включается ровно один раз при компиляции (да-да, та самая &lt;strong&gt;#pragma once&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;objc/Object.h&lt;/strong&gt; – базовый объект для всех объектов языка Objective-C. Он не является обязательным, но управление памятью реализовано в нём.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;@interface&lt;/strong&gt; – первое новое ключевое слово – это объявление нового объекта, содержит во-первых поля объекта (обычная C-структура) и объявления методов объекта в специфическом стиле.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;@implementation – &lt;/strong&gt;реализация объявленных в &lt;strong&gt;@interface&lt;/strong&gt; методов объекта.&lt;/p&gt;

&lt;p&gt;И самое интересное – это посылка сообщений.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MyObject *&lt;/strong&gt; – указатель на объект.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;[ObjectInstance Message: Parameter]&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Итак, это обычные квадратные скобки, которые обозначают посылку сообщения &lt;strong&gt;Message&lt;/strong&gt; некоторому объекту &lt;strong&gt;ObjectInstance&lt;/strong&gt;. Сообщение может содержать упакованные параметры &lt;strong&gt;Parameter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Суть примерно та же, что и в SmallTalk. Объекту можно посылать любые сообщения, обработаны будут только те, которые явно поддерживает объект.&lt;/p&gt;

&lt;p&gt;В моём примере, происходит посылка четырёх сообщений:&lt;/p&gt;

&lt;p&gt;&amp;#160; 1) &lt;strong&gt;[MyObject alloc]&lt;/strong&gt; – посылка сообщения классу &lt;strong&gt;MyObject&lt;/strong&gt; о выделении памяти и создании объекта этого типа.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: Да, да, посылка сообщения происходит именно классу объектов. Классы объектов – являются самостоятельными объектами и все создаются во время старта приложения. Соответственно, возможно им посылать сообщения, и доступна интроспекция.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160; 2) Возвращаемому результату обработки сообщения (это указатель на созданный объект) посылается сообщение &lt;strong&gt;init&lt;/strong&gt;, которое в языке Objective C является соглашением об инициализации объекта (конструктор в терминах других языков).&lt;/p&gt;

&lt;p&gt;&amp;#160; 3) &lt;strong&gt;[myObjectInstance Hello: &lt;span class="str"&gt;&amp;quot;Hello, World!&amp;quot;&lt;/span&gt;]&lt;/strong&gt; – посылка сообщения Hello c параметром.&lt;/p&gt;

&lt;p&gt;&amp;#160; 4) &lt;strong&gt;[myObjectInstance free]&lt;/strong&gt; – освобождение памяти, ранее выделенной под объект через cообщение &lt;strong&gt;alloc&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: Строго говоря, вызов free – необязательно приводит к освобождению памяти, в связи с тем, что в Objective C для управления памятью используется подсчёт ссылок, а в некоторых случаях и GC.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;Рантайм&lt;/h4&gt;

&lt;p&gt;Существует два немного различающихся рантайма: входящий в поставку GCC и от Apple. Отличия у них незначительные. Главное различие – это политика именования заголовочных файлов и классов объектов у Apple: везде добавляется префикс &lt;strong&gt;NS&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: NS – это сокращение от названия &lt;a href="http://en.wikipedia.org/wiki/NextStep"&gt;NextStep&lt;/a&gt;, историческое название предшественника сегодняшней MAC OS. Набор библиотек для Objective C под Windows доступен в пакете &lt;a href="http://www.gnustep.org/experience/Windows.html"&gt;GNUStep&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Примеры:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;GCC: #import &amp;lt;objc/Object.h&amp;gt;

 Apple: #import &amp;lt;Foundation/NSObject.h&amp;gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Аналогичный эппловскому набор рантайм-библиотек (в пределах небольших изменений) поставляется с библиотеками GNUStep.&lt;/p&gt;

&lt;h4&gt;Литература&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.blogger.com/profile/17803764860500024863"&gt;lyxite&lt;/a&gt;: &lt;a href="http://blog.lyxite.com/2008/01/compile-objective-c-programs-using-gcc.html"&gt;Compile Objective-C Programs Using gcc&lt;/a&gt;, &lt;/li&gt;

  &lt;li&gt;Apple: &lt;a href="http://http://developer.apple.com/library/ios/#referencelibrary/GettingStarted/Learning_Objective-C_A_Primer/_index.html"&gt;Learning Objective-C: A Primer&lt;/a&gt;, &lt;/li&gt;

  &lt;li&gt;Wikipedia: &lt;a href="http://ru.wikipedia.org/wiki/Objective_C"&gt;Objective-C&lt;/a&gt;, &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://www.otierney.net/objective-c.html"&gt;Objective-C Begginer’s Guide&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7550093075906678978-4733853149963176736?l=andir-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndirNotes/~4/cPJVyySgO8s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andir-notes.blogspot.com/feeds/4733853149963176736/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://andir-notes.blogspot.com/2011/09/objective-c.html#comment-form" title="Комментарии: 3" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/4733853149963176736?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/4733853149963176736?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AndirNotes/~3/cPJVyySgO8s/objective-c.html" title="Мини-гайд по началам изучения Objective C" /><author><name>Andir</name><uri>http://www.blogger.com/profile/04945404879829884954</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-k7Ma8c_b7bo/Tm8nGLZO5II/AAAAAAAABqk/nYABoeGeaj4/s72-c/image_thumb%25255B1%25255D.png?imgmax=800" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://andir-notes.blogspot.com/2011/09/objective-c.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YGQ3s-cCp7ImA9WxBVGU8.&quot;"><id>tag:blogger.com,1999:blog-7550093075906678978.post-2294486991623320295</id><published>2010-02-23T14:08:00.001+03:00</published><updated>2010-02-23T14:38:42.558+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-23T14:38:42.558+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="visual studio" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="debug" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><title>IntelliTrace – новый инструмент для отладки в Visual Studio 2010</title><content type="html">&lt;p&gt;Совсем недавно &lt;a href="http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx"&gt;вышел&lt;/a&gt; Release Candidate для Visual Studio 2010. Новая студия стала гораздо стабильнее и быстрее, так что пора уже обращать внимание на её новые возможности, а не только на свеженький WPF-интерфейс.&lt;/p&gt;  &lt;p&gt;Около полугода назад я &lt;a href="http://andir-notes.blogspot.com/2009/08/visual-studio-2010-historical-debugger.html"&gt;упоминал&lt;/a&gt; про новую штуку, которую можно найти в Visual Studio 2010: Historical Debugger. Это имя оказалось внутренним, в релиз-кандидате эта возможность называется уже по-другому: IntelliTrace. По-русски это должно звучать, примерно как, “Умный следопыт”.&lt;/p&gt;  &lt;p&gt;Посмотрим на него (на следопыта) вживую!&lt;/p&gt;  &lt;h4&gt;Введение&lt;/h4&gt;  &lt;p&gt;Отладка в современных условиях обычно выполняется одним из следующих методов:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Printf-like отладка, &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;вывод информации во время исполнения программы во внешний поток: консоль, файл и т.п.,&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;Использование интегрированного отладчика, &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;пошаговое выполнение программы под строгим наблюдением с инструментами установки контрольных точек и просмотром значений в переменных, регистрах и т.д.,&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;IntelliTrace это логичное продолжение и совмещение двух этих методов. Записываем всю нужную информацию во время работы приложения и затем можем в любой момент пронаблюдать состояние программы в каждой из записанных точек.&lt;/p&gt;  &lt;p&gt;Понятно, что совсем всю информацию о выполнении приложения записать не получится – это и существенное замедление работы программы и огромный объём данных, поэтому записывается лишь определённый расширяемый набор событий, которые представляются важными для приложения.&lt;/p&gt;  &lt;p&gt;Новый инструмент, несомненно, представляет собой следующий этап развития средств отладки в интегрированных средах разработки.&lt;/p&gt;  &lt;h4&gt;Из огня да в полымя&lt;/h4&gt;  &lt;p&gt;Начнём с наскоку методом интуитивного изучения. Запускаем Visual Studio 2010 RC и создаём простое консольное приложение. Код минимальный, только для демонстрации.&lt;/p&gt;  &lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;   &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Program&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;WriteLine(&lt;span style="color: #a31515"&gt;&amp;quot;Hello, IntelliTrace World!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;ReadKey();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Запускаем. На консоль будет выведено сообщение и программа начнёт ждать нажатия клавиши (&lt;em&gt;Console.ReadKey&lt;/em&gt;). Этого вполне достаточно.&lt;/p&gt;

&lt;p&gt;Открываем окно “IntelliTrace”, если его ещё не видно: &lt;em&gt;Debug&lt;/em&gt; –&amp;gt; &lt;em&gt;Windows&lt;/em&gt; –&amp;gt; &lt;em&gt;IntelliTrace Calls&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;a href="http://lh4.ggpht.com/_cqKDpMpIE24/S4O2-su-mFI/AAAAAAAABR0/DnRUODx99Fg/s1600-h/Intellitrace%20Calls%5B6%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Скриншот: Intellitrace Calls" border="0" alt="Скриншот: Intellitrace Calls" src="http://lh6.ggpht.com/_cqKDpMpIE24/S4O2_KPe4KI/AAAAAAAABR4/fMjgiivU3bQ/Intellitrace%20Calls_thumb%5B3%5D.png?imgmax=800" width="425" height="425" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Всё что нужно далее для активации инструмента написано прямо в этом окне.&lt;/p&gt;

&lt;p&gt;Нажимаем кнопку и программа останавливается. Теперь можно увидеть лог событий, которые были записаны IntelliTrace’ом.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Скриншот: Intellitrace Calls" border="0" alt="Скриншот: Intellitrace Calls" src="http://lh5.ggpht.com/_cqKDpMpIE24/S4O2_gI_qdI/AAAAAAAABR8/a1q-clvvlCw/ProgramIsBreakAll%5B5%5D.png?imgmax=800" width="753" height="368" /&gt; &lt;/p&gt;

&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Скриншот: Intellitrace Calls" border="0" alt="Скриншот: Intellitrace Calls" src="http://lh4.ggpht.com/_cqKDpMpIE24/S4O3AL0sSaI/AAAAAAAABSA/vfSE1ajmZFY/ProgramIsBreakAllIntelliTraceLog%5B5%5D.png?imgmax=800" width="470" height="283" /&gt; &lt;/p&gt;

&lt;p&gt;В списке событий появилось два события: &lt;strong&gt;Beginning of Application&lt;/strong&gt; и &lt;strong&gt;Debugger Break&lt;/strong&gt;. Ничего примечательного, но для начала сойдёт.&lt;/p&gt;

&lt;p&gt;Если выбрать любое событие, то точка останова в программе перемещается на место, где это событие произошло и в окне можно просмотреть подробную информацию о событии.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;a href="http://lh5.ggpht.com/_cqKDpMpIE24/S4O3AqX7zNI/AAAAAAAABSE/lkP8NmToIPI/s1600-h/IntelliTraceLogSelectedEvent%5B4%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Скриншот: Intellitrace Calls" border="0" alt="Скриншот: Intellitrace Calls" src="http://lh3.ggpht.com/_cqKDpMpIE24/S4O3BKKbG2I/AAAAAAAABSI/OgAbV9Y7SQ8/IntelliTraceLogSelectedEvent_thumb%5B1%5D.png?imgmax=800" width="467" height="252" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;Настройки&lt;/h4&gt;

&lt;p&gt;Для настройки работы IntelliTrace появился целый узел в дереве Options:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Скриншот: Настройки IntelliTrace" border="0" alt="Скриншот: Настройки IntelliTrace" src="http://lh6.ggpht.com/_cqKDpMpIE24/S4O3BkZ0reI/AAAAAAAABSM/OG8L8haARkc/OptionsIntelliTraceGeneral%5B6%5D.png?imgmax=800" width="866" height="582" /&gt; &lt;/p&gt;

&lt;p&gt;IntelliTrace может работать в двух режимах: &lt;em&gt;IntelliTrace events only&lt;/em&gt; и &lt;em&gt;IntelliTrace events and call information&lt;/em&gt;, которые определяют уровень и количество записываемой информации. Оба режима настраиваются и позволяют определять какие именно события записывать, а какие игнорировать.&lt;/p&gt;

&lt;p&gt;Если перейти на подузел настроек &lt;em&gt;IntelliTrace Events&lt;/em&gt;, то можно увидеть тот самый список значимых событий, который подготовили в Microsoft:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Скриншот: IntelliTrace -&amp;gt; IntelliTrace Events" border="0" alt="Скриншот: IntelliTrace -&amp;gt; IntelliTrace Events" src="http://lh5.ggpht.com/_cqKDpMpIE24/S4O3CClhz0I/AAAAAAAABSQ/czLneEtKir8/OptionsIntelliTraceEvents%5B5%5D.png?imgmax=800" width="866" height="582" /&gt; &lt;/p&gt;

&lt;p&gt;О! Это уже что-то, давайте добавим к нашему первому примеру запись всех событий Console. Отмечаем галочкой группу Console и запускаем:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Скриншот: запуск программы с включенным логированием событий Console" border="0" alt="Скриншот: запуск программы с включенным логированием событий Console" src="http://lh6.ggpht.com/_cqKDpMpIE24/S4O3Ckqsh7I/AAAAAAAABSU/A5K5kIy-emk/IntelliTraceRunPlusConsole%5B6%5D.png?imgmax=800" width="651" height="734" /&gt; &lt;/p&gt;

&lt;p&gt;Теперь событий стало три. IntelliTrace залогировал событие вывода на консоль и мы можем легко перейти в это место и посмотреть состояние программы в этот момент.&lt;/p&gt;

&lt;p&gt;Теперь пора перейти к более сложному примеру.&lt;/p&gt;

&lt;h4&gt;Пример использования с ASP.Net MVC&lt;/h4&gt;

&lt;p&gt;Для большего понимания работы инструмента, продемонстрирую запуск IntelliTrace в случае приложения на базе фреймворка ASP.Net MVC 2. &lt;/p&gt;

&lt;p&gt;Создаём проект IntelliTrace.AspNetMvc в студии с помощью стандартного шаблона. Настраиваем IntelliTrace на логирование всех событий и информации о вызовах методов. И запускаем. Придётся подождать.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Скриншот: запуск программы с включенным логированием событий Console" border="0" alt="Скриншот: запуск программы с включенным логированием событий Console" src="http://lh3.ggpht.com/_cqKDpMpIE24/S4O3DMwH7hI/AAAAAAAABSY/nvz976S1vYw/AspNetMvcStarted%5B7%5D.png?imgmax=800" width="563" height="340" /&gt; &lt;/p&gt;

&lt;p&gt;После этого жмём на Break All в инструменте IntelliTrace и смотрим на список залогированных событий:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Скриншот: список событий залогированных IntelliTrace для ASP.Net Mvc приложения" border="0" alt="Скриншот: список событий залогированных IntelliTrace для ASP.Net Mvc приложения" src="http://lh5.ggpht.com/_cqKDpMpIE24/S4O8wtkn6MI/AAAAAAAABS8/gYoQZzMtISM/AspNetMvcIntelliTrace%5B8%5D.png?imgmax=800" width="791" height="763" /&gt; &lt;/p&gt;

&lt;p&gt;В этот список попали два вида событий: Исключения (брошенные и пойманные) и события ASP.Net (HTTP-запрос и сохранение состояния).&lt;/p&gt;

&lt;p&gt;Так как мы включили логирование ещё и всех вызовов, то сверху окна IntelliTrace появилась возможность переключится на Calls View – список вызовов.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Скриншот: стэк вызовов для данного события залогированного IntelliTrace для ASP.Net Mvc приложения" border="0" alt="Скриншот: стэк вызовов для данного события залогированного IntelliTrace для ASP.Net Mvc приложения" src="http://lh3.ggpht.com/_cqKDpMpIE24/S4O3ENRLjiI/AAAAAAAABSg/H5Hu9BsW9XA/AspNetMvcIntelliTraceCallsView%5B6%5D.png?imgmax=800" width="663" height="229" /&gt; &lt;/p&gt;

&lt;p&gt;В этом окне пока ничего интересного не видно. &lt;/p&gt;

&lt;p&gt;Рассмотрим одно из залогированных событий. Пусть это будет событие ASP.Net: GET ‘/’.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Скриншот: стэк вызовов для данного события залогированного IntelliTrace для ASP.Net Mvc приложения" border="0" alt="Скриншот: стэк вызовов для данного события залогированного IntelliTrace для ASP.Net Mvc приложения" src="http://lh6.ggpht.com/_cqKDpMpIE24/S4O3Eg2Qc0I/AAAAAAAABSk/Ehu04BFsHNY/AspNetMvcIntelliTraceSelectedEvent%5B5%5D.png?imgmax=800" width="797" height="718" /&gt; &lt;/p&gt;

&lt;p&gt;При выборе этого события становится видна дополнительная информация о событии и набор ссылок, которые указывают на связанную с этим событием информацию: залогированные вызовы методов (Calls View), локальные данные (Locals) и стэк вызовов (Call Stack):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IntelliTrace Calls View:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Скриншот: Залогированные вызовы методов для точки IntelliTrace" border="0" alt="Скриншот: Залогированные вызовы методов для точки IntelliTrace" src="http://lh3.ggpht.com/_cqKDpMpIE24/S4O3FMp36QI/AAAAAAAABSo/ov8kEcol8ng/AspNetMvcIntelliTraceCallsViewForGet%5B5%5D.png?imgmax=800" width="680" height="630" /&gt; &lt;/p&gt;

&lt;p&gt;Вот теперь в окне Calls View теперь стало гораздо больше информации: появился контекст события: стало видно какие из записанных событий IntelliTrace предшествовали данному, какие происходили после. В данном окне можно перемещаться по событиям и просматривать связанную с ними информацию.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IntelliTrace Locals:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;a href="http://lh6.ggpht.com/_cqKDpMpIE24/S4O3FnWI9jI/AAAAAAAABSs/4sc1XhBIGp0/s1600-h/AspNetMvcIntelliTraceLocalsForGet%5B4%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Скриншот: локальные данные для точки IntelliTrace" border="0" alt="Скриншот: локальные данные для точки IntelliTrace" src="http://lh3.ggpht.com/_cqKDpMpIE24/S4O3GNzPXpI/AAAAAAAABSw/zD7CFCjPQjs/AspNetMvcIntelliTraceLocalsForGet_thumb%5B1%5D.png?imgmax=800" width="588" height="352" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;В окне Locals отображается та информация, которая существенна для данного события: HTTP-метод, который использовался для доступа и Url. Набор этой информации весьма ограничен и определяется настройками этого типа событий IntelliTrace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IntelliTrace Stack Trace:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Скриншот: Стэк вызовов для точки IntelliTrace" border="0" alt="Скриншот: Стэк вызовов для точки IntelliTrace" src="http://lh5.ggpht.com/_cqKDpMpIE24/S4O3GqYzlbI/AAAAAAAABS0/0y3i3TaGycg/AspNetMvcIntelliTraceStackTraceForGet%5B5%5D.png?imgmax=800" width="587" height="353" /&gt; &lt;/p&gt;

&lt;p&gt;Собственно снимок стэка исполнения в данной точке, хорошо известный всем разработчикам под .Net, кто хотя бы раз сталкивался с отладкой своего приложения.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: Но, честно говоря, информации о конкретном событии в заданной точке IntelliTrace залогировано достаточно мало. Хотелось бы видеть немного больше информации: например состояние HttpContext для данного вызова, данные Htpp-запроса и т.п.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;Технические детали&lt;/h4&gt;

&lt;p&gt;IntelliTrace как и Code Contracts во время своей работы инжектит специальные методы в результирующую сборку (Post Build IL Rewriting). &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: Кодовое имя IntelliTrace, которое довольно часто встречается в реестре и файлах VS 2010: Proteus.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Фактически сам IntelliTrace реализован как отдельный процесс, который запускается отдельно с помощью консольной программы &lt;em&gt;%ProgramFiles%\Microsoft Visual Studio 10.0\Team Tools\TraceDebugger Tools\IntelliTrace.exe&lt;/em&gt;. Поэтому во время любого сеанса IntelliTrace этот процесс можно обнаружить у себя в диспетчере задач.&lt;/p&gt;

&lt;p&gt;Запускается он обычно где-то так:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="str"&gt;&amp;quot;C:\Program Files\Micrsoft Visual Studio 10.0\Team Tools\TraceDebugger Tools\IntelliTrace.EXE&amp;quot;&lt;/span&gt; 
    run 
    /n:&lt;span class="str"&gt;&amp;quot;intellitrace.console.vshost.exe_00000ba0_01cab4109a27f296&amp;quot;&lt;/span&gt; 
    /cp:&lt;span class="str"&gt;&amp;quot;C:\Users\Andir\AppData\Local\Microsoft\VisualStudio\10.0\TraceDebugger\Settings\zrnoutrh.ozc&amp;quot;&lt;/span&gt; 
    /f:&lt;span class="str"&gt;&amp;quot;IntelliTrace.Console.vshost_00000ba0_100223_014433.iTrace&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Параметры: /n – это имя логгера, /cp – это путь до файла с настройками, /f – имя файла, в который будет складываться информация.&lt;/p&gt;

&lt;p&gt;Вся информация, которая сохраняется во время сеанса IntelliTrace исполнения программы пишется в специальный файл бинарного формата, который находится в папке &lt;em&gt;%ProgramData%\Microsoft Visual Studio\10.0\TraceDebugging\ &lt;/em&gt;и имеет расширение *.iTrace. Visual Studio во время сеанса отладки с использованием IntelliTrace загружает этот файл и использует для навигации по точкам исполнения и загрузки информации записанной в этих точках.&lt;/p&gt;

&lt;p&gt;Настройки по умолчанию IntelliTrace находятся в файле: &lt;em&gt;%ProgramFiles%\Microsoft Visual Studio 10.0\Team Tools\TraceDebugger Tools\en\CollectionPlan.xml&lt;/em&gt;. К сожалению, Visual Studio напрямую не использует этот файл для настройки IntelliTrace. Перед запуском IntelliTrace.exe студия копирует (сериализует) собственные настройки IntelliTrace в отдельный файл в папке: &lt;em&gt;%LocalAppData%\Microsoft\VisualStudio\10.0\TraceDebugger\Settings\&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Взглянем на файл c настройками поподробнее:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Скриншот: файл с настройками IntelliTrace" border="0" alt="Скриншот: файл с настройками IntelliTrace" src="http://lh3.ggpht.com/_cqKDpMpIE24/S4O-QSOuRKI/AAAAAAAABTE/g7wIU31J29U/CollectionPlanXml%5B12%5D.png?imgmax=800" width="804" height="466" /&gt; &lt;/p&gt;

&lt;p&gt;Ничего специфического в этом файле на первый взгляд не видно: здесь просто собраны все те настройки, что видно в диалоге Options –&amp;gt; IntelliTrace и в студии. Но давайте приглядимся к одной немаловажной детали: TracePointProvider и DiagnosticEventSpecification. &lt;/p&gt;

&lt;p&gt;Из их названий, собственно, уже понятно, что так скомпонованы провайдер точек, которые будет записывать IntelliTrace. А DiagnosticEventSpecification – определяет спецификацию одной из таких точек. Рассмотрим спецификацию события Console.WriteLine:&lt;/p&gt;

&lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;
  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DiagnosticEventSpecification&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;enabled&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;false&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;CategoryId&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;console&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;CategoryId&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SettingsName&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;_locID&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;settingsName.Console.WriteLine.Object&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;WriteLine (Object)&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SettingsName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SettingsDescription&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;_locID&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;settingsDescription.Console.WriteLine.Object&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Console Output with an Object passed in.&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SettingsDescription&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ModuleSpecificationId&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;mscorlib&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ModuleSpecificationId&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TypeName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;System.Console&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TypeName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;MethodName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;WriteLine&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;MethodName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;MethodId&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;System.Console.WriteLine(System.Object):System.Void&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;MethodId&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProgrammableDataQuery&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ModuleName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Microsoft.VisualStudio.DefaultDataQueries.dll&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ModuleName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TypeName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Microsoft.VisualStudio.DataQueries.Console.Output.WriteLineDataQuery&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TypeName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ProgrammableDataQuery&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DiagnosticEventSpecification&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Итак, первое что мы видим - это набор настроек точки: категория, название, описание. Второе – это некоторые &lt;em&gt;Bindings&lt;/em&gt;, которые очевидно и связывают точку и те данные, которые записываются в этой точке.&lt;/p&gt;

&lt;p&gt;Для события Console.WriteLine существует всего один биндинг, который определяет метод System.Console.WriteLine с двумя аргументами. ModuleSpecificationId – это сборка, в которой находится искомый метод, TypeName – имя типа, MethodName – имя метода и MethodId – это искомая перегрузка данного метода.&lt;/p&gt;

&lt;p&gt;И последнее что мы видим – это некоторый ProgrammableDataQuery – который по сути является основой для IntelliTrace в получении информации о событии в точке записи. &lt;/p&gt;

&lt;p&gt;Воспользовавшись рефлектором можно обнаружить, что ProgrammableDataQuery – это управляемый класс (в вышеприведённом примере это Microsoft.VisualStudio.DataQueries.Console.Output.WriteLineDataQuery), который отнаследован от интерфейса IProgrammableDataQuery:&lt;/p&gt;

&lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IProgrammableDataQuery&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Methods&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;object&lt;/span&gt;[] EntryQuery(&lt;span style="color: blue"&gt;object&lt;/span&gt; thisArg, &lt;span style="color: blue"&gt;object&lt;/span&gt;[] args);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;object&lt;/span&gt;[] ExitQuery(&lt;span style="color: blue"&gt;object&lt;/span&gt; returnValue);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;CollectedValueTuple&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; FormatCollectedValues(&lt;span style="color: blue"&gt;object&lt;/span&gt;[] results);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; FormatLongDescription(&lt;span style="color: blue"&gt;object&lt;/span&gt;[] results);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; FormatShortDescription(&lt;span style="color: blue"&gt;object&lt;/span&gt;[] results);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;Location&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetAlternateLocations(&lt;span style="color: blue"&gt;object&lt;/span&gt;[] results);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Гораздо чаще, чем ProgrammableDataQuery, в CollectionPlan.xml используется DataQuery. Судя по всему – это стандартная реализация, которая автоматически получает данные от текущего класса (очень похоже на Reflection). В параметрах задаётся путь к определённой внутренней переменной класса:&lt;/p&gt;

&lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;
  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DiagnosticEventSpecification&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;CategoryId&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;system.data&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;CategoryId&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SettingsName&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;_locID&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;settingsName.OdbcCommand.ExecuteReader&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;ExecuteReader (ODBCCommand)&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SettingsName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SettingsDescription&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;_locID&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;settingsDescription.OdbcCommand.ExecuteReader&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Command text was executed, building an OdbcDataReader using one of the CommandBehavior values. (just test)&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SettingsDescription&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ModuleSpecificationId&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;system.data&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ModuleSpecificationId&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TypeName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;System.Data.Odbc.OdbcCommand&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TypeName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;MethodName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;ExecuteReader&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;MethodName&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;MethodId&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;System.Data.Odbc.OdbcCommand.ExecuteReader(System.Data.CommandBehavior):System.Data.Odbc.OdbcDataReader&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;MethodId&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ShortDescription&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;_locID&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;shortDescription.OdbcCommand.ExecuteReader&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Execute Reader &amp;quot;{0}&amp;quot;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ShortDescription&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;LongDescription&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;_locID&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;longDescription.OdbcCommand.ExecuteReader&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;The command text &amp;quot;{0}&amp;quot; was executed on connection &amp;quot;{1}&amp;quot;, building an OdbcDataReader using one of the CommandBehavior values.&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;LongDescription&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataQueries&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataQuery&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;index&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;maxSize&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;4096&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;String&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Command Text&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;_locID&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;dataquery.OdbcCommand.ExecuteReader.CommandText&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;_locAttrData&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;name&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;query&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&lt;strong&gt;_commandText&lt;/strong&gt;&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataQuery&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataQuery&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;index&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;maxSize&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;256&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;String&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Connection String&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;_locID&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;dataquery.OdbcCommand.ExecuteReader.ConnectionString&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;_locAttrData&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;name&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;query&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&lt;strong&gt;_connection._userConnectionOptions._usersConnectionString&lt;/strong&gt;&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataQuery&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataQueries&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Bindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DiagnosticEventSpecification&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Как видно, в данном случае, с помощью запросов получают из параметра с индексом 0 (это this) строку соединения (Connection String) и команду SQL (Command Text).&lt;/p&gt;

&lt;p&gt;Судя по файлу CollectionPlan.xml, механизм IntelliTrace представляет собой хорошо расширяемую платформу. Но пока Visual Studio не предоставляет никаких механизмов для добавления, например, своих событий для записи. Единственное, что возможно – это создавать свои собственные iTrace файлы для определённой конфигурации CollectionPlan. Полагаю, что это задел на будущее для каких-то новых инструментов, например Code Coverage. &lt;/p&gt;

&lt;h4&gt; Заключение&lt;/h4&gt;

&lt;p&gt;Описанный новый инструментарий для разработчика в такой консервативной области как отладка приложений выглядит очень многообещающе. Предполагаю, что скорее всего логирование IntelliTrace в релизе будет включено по умолчанию и позволит разработчикам видеть все ключевые точки работы приложения прямо во время разработки.&lt;/p&gt;

&lt;p&gt;Ещё более многообещающей выглядит область будущих применений *.iTrace файлов. Собранная информация позволит анализировать работу приложений как в ручном, так и в автоматическом режиме. Это поможет выявлять ошибки, собирать статистику о работе приложения, реализовывать автоматические функциональные тесты основанные на точках, которые должно пройти приложение и т.п.&lt;/p&gt;

&lt;h4&gt;Литература для дальнейшего изучения&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;MSDN, &lt;a href="http://msdn.microsoft.com/en-us/library/dd264915%28VS.100%29.aspx"&gt;Debugging With IntelliTrace&lt;/a&gt;, &lt;/li&gt;

  &lt;li&gt;Ian Huf blog: &lt;a href="http://blogs.msdn.com/ianhu/default.aspx"&gt;IntelliTrace Info&lt;/a&gt;, &lt;/li&gt;

  &lt;li&gt;John Robbins blog*: &lt;a href="http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/10/19/vs-2010-beta-2-intellitrace-in-depth-first-look.aspx"&gt;VS 2010 Beta 2 IntelliTrace In-Depth First Look&lt;/a&gt;, &lt;/li&gt;

  &lt;li&gt;John Robbins blog: &lt;a href="http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/06/16/how-does-vs2010-historical-debugging-work.aspx"&gt;How Does VS2010 Historical Debugging Work?&lt;/a&gt;, &lt;/li&gt;

  &lt;li&gt;Habib Heydarian blog: &lt;a href="http://blogs.msdn.com/habibh/archive/2009/09/21/coverage-of-the-visual-studio-2010-historical-debugger.aspx"&gt;Coverage of the Visual Studio 2010 Historical Debugger&lt;/a&gt;, &lt;/li&gt;

  &lt;li&gt;Ian Huf blog: &lt;a href="http://blogs.msdn.com/ianhu/archive/2010/02/10/intellitrace-and-collectionplan-xml.aspx"&gt;IntelliTrace and CollectionPlan.xml&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;* – John Robbins, Джон Роббинс – автор известной книги “Отладка приложений для Microsoft .NET и Microsoft Windows”.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7550093075906678978-2294486991623320295?l=andir-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndirNotes/~4/5x4zstoaiLw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andir-notes.blogspot.com/feeds/2294486991623320295/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://andir-notes.blogspot.com/2010/02/intellitrace-new-tool-for-debugging-in.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/2294486991623320295?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/2294486991623320295?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AndirNotes/~3/5x4zstoaiLw/intellitrace-new-tool-for-debugging-in.html" title="IntelliTrace – новый инструмент для отладки в Visual Studio 2010" /><author><name>Andir</name><uri>http://www.blogger.com/profile/04945404879829884954</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_cqKDpMpIE24/S4O2_KPe4KI/AAAAAAAABR4/fMjgiivU3bQ/s72-c/Intellitrace%20Calls_thumb%5B3%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://andir-notes.blogspot.com/2010/02/intellitrace-new-tool-for-debugging-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YERnYzeip7ImA9WxNRGE4.&quot;"><id>tag:blogger.com,1999:blog-7550093075906678978.post-1240888670713938885</id><published>2009-09-13T14:49:00.001+04:00</published><updated>2009-09-13T14:51:47.882+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-13T14:51:47.882+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><title>Пример декларативного биндинга asp:TreeView</title><content type="html">&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Рассмотрим пример биндинга asp:TreeView к XmlDataSource.&lt;/p&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;pre style="margin: 0px"&gt;&lt;span style="background: #ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@&lt;/span&gt; &lt;span style="color: #a31515"&gt;Page&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;MasterPageFile&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;~/Shared/Site.Master&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;CodeBehind&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;TreeView.aspx.cs&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Home.Andir.Examples.TreeViewPage&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: #ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt; &lt;span style="color: red"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;BodyPlaceHolder&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeView&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;treeView&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;DataSourceID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;xmlDataSource&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataBindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeNodeBinding&lt;/span&gt; &lt;span style="color: red"&gt;TextField&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataBindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeView&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;XmlDataSource&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;xmlDataSource&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Data&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Root&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Root&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node 1&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node 2&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node 3&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node 3.1&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Root&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Data&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;XmlDataSource&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;И результат:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Скриншот: Результат выполнения декларативного биндинга к XmlDataSource" border="0" alt="Скриншот: Результат выполнения декларативного биндинга к XmlDataSource" src="http://lh6.ggpht.com/_cqKDpMpIE24/SqzOPIdp7vI/AAAAAAAAAqA/pUz2BsShnS8/treeview_with_xmldatasource4.png?imgmax=800" width="449" height="334" /&gt; &lt;/p&gt;

&lt;p&gt;Как видим, биндинг вполне прямолинейный и полностью декларативный, XML-данные можно хранить прямо в разметке или подгружать из внешнего файла (с помощью свойства &lt;strong&gt;DataFile&lt;/strong&gt;), мало того, XML можно перед биндингом трансформировать с помощью XSLT (с помощью свойства &lt;strong&gt;Transform&lt;/strong&gt;).&lt;/p&gt;

&lt;h4&gt;Пример биндинга к RSS&lt;/h4&gt;

&lt;p&gt;Необходимость писать дополнительный код появляется только если требуется получать XML от какого-то внешнего источника. Например, строить по данным из БД или получать RSS-фид из интернета.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="background: #ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@&lt;/span&gt; &lt;span style="color: #a31515"&gt;Page&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;MasterPageFile&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;~/Shared/Site.Master&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;CodeBehind&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;TreeView.aspx.cs&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Home.Andir.Examples.TreeViewPage&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: #ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt; &lt;span style="color: red"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;BodyPlaceHolder&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeView&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;treeView&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;DataSourceID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;feedDataSource&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataBindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeNodeBinding&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;DataMember&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;feed&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;FormatString&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Блог: {0}&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;TextField&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;title&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeNodeBinding&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;DataMember&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;entry&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;FormatString&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Запись: {0}&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;TextField&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;title&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;NavigateUrlField&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;url&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataBindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeView&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;XmlDataSource&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;feedDataSource&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Transform&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515"&gt;xml&lt;/span&gt; &lt;span style="color: red"&gt;version&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;encoding&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;stylesheet&lt;/span&gt; &lt;span style="color: red"&gt;version&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a31515"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;xsl&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a31515"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;atom&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;http://www.w3.org/2005/Atom&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;exclude-result-prefixes&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;atom&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;template&lt;/span&gt; &lt;span style="color: red"&gt;match&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;atom:feed&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;feed&lt;/span&gt; &lt;span style="color: red"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;{atom:title}&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;apply-templates&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;feed&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;template&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;template&lt;/span&gt; &lt;span style="color: red"&gt;match&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;atom:entry&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;entry&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;{atom:title}&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;url&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;{atom:link[@rel='alternate']/@href}&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;apply-templates&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;entry&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;template&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;xsl&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;stylesheet&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Transform&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;XmlDataSource&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;и немного кода:&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Net;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Text;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;partial&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;TreeViewPage&lt;/span&gt; : System&lt;span style="color: purple"&gt;.&lt;/span&gt;Web&lt;span style="color: purple"&gt;.&lt;/span&gt;UI&lt;span style="color: purple"&gt;.&lt;/span&gt;&lt;span style="color: #2b91af"&gt;Page&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; rssFeedUrl &lt;span style="color: purple"&gt;=&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a31515"&gt;&amp;quot;http://feeds2.feedburner.com/AndirNotes&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; feedDataSource&lt;span style="color: purple"&gt;.&lt;/span&gt;Data &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DownloadRssFeed(rssFeedUrl);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; DownloadRssFeed(&lt;span style="color: blue"&gt;string&lt;/span&gt; url)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; client &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;WebClient&lt;/span&gt;();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; resultBytes &lt;span style="color: purple"&gt;=&lt;/span&gt; client&lt;span style="color: purple"&gt;.&lt;/span&gt;DownloadData(url);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Encoding&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;UTF8&lt;span style="color: purple"&gt;.&lt;/span&gt;GetString(resultBytes);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Результатом будет следующее дерево:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Скриншот: Результат выполнения биндинга к моему RSS" border="0" alt="Скриншот: Результат выполнения биндинга к моему RSS" src="http://lh6.ggpht.com/_cqKDpMpIE24/SqzORgMbUeI/AAAAAAAAAqE/QzSc6DOsLqE/treeview_with_xmldatasource_feed4.png?imgmax=800" width="531" height="312" /&gt;&lt;/p&gt;

&lt;p&gt;В этом случае всё очень просто, однако для более изощрённых истоников иерархических данных может понадобится собственная реализация IHierarchicalDataSource. Вопросы реализации этого интерфейса рассматриваются в заметке: &lt;a href="http://andir-notes.blogspot.com/2009/09/ihierarchicaldatasource-generic.html"&gt;Реализация обобщённого варианта IHierarchicalDataSource&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7550093075906678978-1240888670713938885?l=andir-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndirNotes/~4/y89_IARGjeg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andir-notes.blogspot.com/feeds/1240888670713938885/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://andir-notes.blogspot.com/2009/09/asptreeview-decrarative-binding.html#comment-form" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/1240888670713938885?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/1240888670713938885?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AndirNotes/~3/y89_IARGjeg/asptreeview-decrarative-binding.html" title="Пример декларативного биндинга asp:TreeView" /><author><name>Andir</name><uri>http://www.blogger.com/profile/04945404879829884954</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_cqKDpMpIE24/SqzOPIdp7vI/AAAAAAAAAqA/pUz2BsShnS8/s72-c/treeview_with_xmldatasource4.png?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://andir-notes.blogspot.com/2009/09/asptreeview-decrarative-binding.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UHSXY-cCp7ImA9WxNRGE4.&quot;"><id>tag:blogger.com,1999:blog-7550093075906678978.post-5727684102915237804</id><published>2009-09-13T14:30:00.001+04:00</published><updated>2009-09-13T14:53:58.858+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-13T14:53:58.858+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><category scheme="http://www.blogger.com/atom/ns#" term="advanced" /><title>Реализация обобщённого варианта IHierarchicalDataSource</title><content type="html">&lt;p&gt;Задача отображения иерархических данных достаточно часто встречается в практике. Это и файловая структура (папка-&amp;gt;папка-&amp;gt;…-&amp;gt;файл), и&amp;#160; организационная структура компании (департамент-&amp;gt;отдел-&amp;gt;группа), и иерархия подчинения сотрудников (директор-&amp;gt;менеджер-&amp;gt;рядовой сотрудник), и проектная деятельность (группа проектов-&amp;gt;проект-&amp;gt;подсистема-&amp;gt;задача).&lt;/p&gt;  &lt;p&gt;В стандартной поставке ASP.Net есть два основных контрола, которые поддерживают отображение иерархических данных: &lt;strong&gt;asp:TreeView&lt;/strong&gt; и &lt;strong&gt;asp:Menu&lt;/strong&gt;. Кроме того, они также поддерживают биндинг с иерархическим источником данных, т.е. с таким источником, который реализует интерфейс &lt;strong&gt;IHierarchicalDataSource&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;Источников, которые реализуют интерфейс &lt;strong&gt;IHierarchicalDataSource&lt;/strong&gt;, существует всего два, это: &lt;strong&gt;XmlDataSource&lt;/strong&gt; и &lt;strong&gt;SiteMapDataSource&lt;/strong&gt;. Кроме того, эти источники одновременно являются декларативными элементами UI, которые можно использовать в разметке.&lt;/p&gt;  &lt;p&gt;Например:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;XmlDataSource.aspx&lt;/strong&gt;&lt;/p&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;pre style="margin: 0px"&gt;&lt;span style="background: #ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@&lt;/span&gt; &lt;span style="color: #a31515"&gt;Page&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;MasterPageFile&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;~/Shared/Site.Master&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="background: #ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt; &lt;span style="color: red"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;BodyPlaceHolder&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeView&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;treeView&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;DataSourceID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;xmlDataSource&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataBindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeNodeBinding&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;DataMember&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Root&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Root&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeNodeBinding&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;DataMember&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;TextField&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataBindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeView&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;XmlDataSource&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;xmlDataSource&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Data&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Root&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node 1&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node 2&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node 2.1&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node 2.2&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Node&lt;/span&gt; &lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Node 1&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Root&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Data&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;XmlDataSource&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Примечание: Более подробный пример использования биндинга asp:TreeView к XmlDataSource можно посмотреть в следующей &lt;a href="http://andir-notes.blogspot.com/2009/09/asptreeview-decrarative-binding.html"&gt;заметке&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;А что, если требуется отобразить данные полученные из базы данных? Для этого придётся самостоятельно реализовывать указанный интерфейс &lt;strong&gt;IHierarchicalDataSource&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;Модель&lt;/h4&gt;

&lt;p&gt;Рассмотрим типичную модель древовидных данных хранимых в БД:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Скриншот: Таблица в базе данных с типичной древовидной структурой" border="0" alt="Скриншот: Таблица в базе данных с типичной древовидной структурой" src="http://lh5.ggpht.com/_cqKDpMpIE24/SqzJIBBQBLI/AAAAAAAAApo/40aKrAmHrSk/TreeTable4.png?imgmax=800" width="650" height="223" /&gt; &lt;/p&gt;

&lt;p&gt;Как видно на скриншоте, модель представляет собой таблицу со следующими полями: ID – уникальный идентификатор записи, ParentID – ключ для связи с родительской записью или NULL – если запись является корневой.&lt;/p&gt;

&lt;p&gt;После извлечения данных, древовидные данные отображаются на конкретную модель. Рассмотрим две наиболее часто используемых модели.&lt;/p&gt;

&lt;p&gt;Первая – это прямолинейная проекция структуры БД на объект:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Скриншот: Диграмма классов для PlainTreeModel" border="0" alt="Скриншот: Диграмма классов для PlainTreeModel" src="http://lh6.ggpht.com/_cqKDpMpIE24/SqzJJeEMuCI/AAAAAAAAAps/BlKnUT5T0_4/PlainTreeModel4.png?imgmax=800" width="478" height="483" /&gt; &lt;/p&gt;

&lt;p&gt;Второй вариант обычно возникает при использовании продвинутых средств отображения (ORM):&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Скриншот: Диаграмма классов для ORMTreeModel" border="0" alt="Скриншот: Диаграмма классов для ORMTreeModel" src="http://lh6.ggpht.com/_cqKDpMpIE24/SqzJPkafsuI/AAAAAAAAApw/9vS-mFszA80/ORMTreeModel4.png?imgmax=800" width="529" height="503" /&gt; &lt;/p&gt;

&lt;p&gt;В данном случае, видим что вместо одного поля &lt;strong&gt;ParentID&lt;/strong&gt; создано два дополнительных поля: &lt;strong&gt;Parent&lt;/strong&gt; и &lt;strong&gt;Children&lt;/strong&gt;. &lt;strong&gt;Parent&lt;/strong&gt; – это ссылка на родительский элемент &lt;strong&gt;ORMTreeModel&lt;/strong&gt;, а &lt;strong&gt;Children&lt;/strong&gt; – перебираемая последовательность дочерних объектов &lt;strong&gt;ORMTreeModel&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Представим себе, что нам требуется отобразить данные смоделированные подобным образом в контроле asp:TreeView. Для этого потребуется реализовать интерфейс &lt;strong&gt;IHierarchicalDataSource.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;Реализация интерфейса IHierarchicalDataSource&lt;/h4&gt;

&lt;p&gt;Любая реализация &lt;strong&gt;IHierarchicalDataSource&lt;/strong&gt; напрямую связана с реализацией абстрактного класса &lt;strong&gt;HierarchicalDataSourceView&lt;/strong&gt; и интерфейсов &lt;strong&gt;IHierarchicalEnumerable&lt;/strong&gt; и &lt;strong&gt;IHierarchyData&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Вот как это выглядит в виде диаграммы классов:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Скриншот: Диаграмма классов для реализации IHierarchicalDataSource" border="0" alt="Скриншот: Диаграмма классов для реализации IHierarchicalDataSource" src="http://lh5.ggpht.com/_cqKDpMpIE24/SqzJWw5dnLI/AAAAAAAAAp0/NtCaod8uQ1k/IHierarchicalDataSource4.png?imgmax=800" width="695" height="547" /&gt; &lt;/p&gt;

&lt;p&gt;Центральным звеном реализации является IHierarchyData, который и абстрагирует модель древовидных данных.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: На скриншоте есть одна известная ошибка диаграммы классов генерируемой Visual Studio. Дизайнер диаграмм показывает поля с именем Item переименованными в this. Что хорошо видно в интерфейсе IHierarchyData. В данном случае, это конечно же неверно.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: Также обратите внимание, что интерфейс IHierarchyData во многом повторяет класс ORMTreeModel приведённый выше.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Теперь определимся с задачей, которую нам предстоит решить. Нужно получать древовидные данные из внешнего источника данных и преобразовывать их к иерархическому источнику данных. Желательно абстрагироваться от конкретного источника и конкретного вида модели данных.&lt;/p&gt;

&lt;h4&gt;Типизированные обёртки для базовых интерфейсов&lt;/h4&gt;

&lt;p&gt;Для начала, сделаем некоторые приготовления и реализуем типизированные версии интерфейсов &lt;strong&gt;IHierarchyData&lt;/strong&gt; и &lt;strong&gt;IHierarchyEnumerable&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HierarchyData.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Web&lt;span style="color: purple"&gt;.&lt;/span&gt;UI;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;IHierarchyData&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetParent();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchicalEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetChildren();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; T Item { &lt;span style="color: blue"&gt;get&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IHierarchyData Members&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IHierarchyData&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;GetParent()&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; GetParent();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; HasChildren { &lt;span style="color: blue"&gt;get&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IHierarchicalEnumerable&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;GetChildren()&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; GetChildren();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;object&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;Item&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; Item; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Path { &lt;span style="color: blue"&gt;get&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Type { &lt;span style="color: blue"&gt;get&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;HierarchyEnumerable.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Web&lt;span style="color: purple"&gt;.&lt;/span&gt;UI;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchicalEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color: #2b91af"&gt;IHierarchicalEnumerable&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetHierarchyData(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T enumeratedItem);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IHierarchicalEnumerable Members&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IHierarchyData&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchicalEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;GetHierarchyData(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;object&lt;/span&gt; enumeratedItem)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; GetHierarchyData((T)enumeratedItem);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IEnumerable Members&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerator&lt;/span&gt; GetEnumerator();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Всё максимально прямолинейно, просто прячем нетипизированные версии за явной реализацией интерфейса, а наружу выставляем только типизированные версии этих же методов и свойств.&lt;/p&gt;

&lt;h4&gt;Репозиторий&lt;/h4&gt;

&lt;p&gt;Определим интерфейс для обобщённого хранилища объектов, из которого мы будем получать данные для иерархического обхода:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IHierarchyDataRepository.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
    &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
      &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
        &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections&lt;span style="color: purple"&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;where&lt;/span&gt; T : &lt;span style="color: blue"&gt;class&lt;/span&gt;&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T GetParent(T item);&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetChildren(T item);&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetItemType(T item);&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T GetItem(&lt;span style="color: blue"&gt;string&lt;/span&gt; hierarchyPath);&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetItemHierarchyPath(&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; parentHierarchyPath, T item);&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

        &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Для чего нужен этот интерфейс? Он предназначен для абстрагирования от конкретных источников иерархических данных и его реализации должны быть привязаны к некоторому внешнему источнику.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: Необходимо обратить внимание, что в данном варианте интерфейса и дальнейшей реализации используется неявное предположение для метода GetChildren: если передан параметр со значением &lt;strong&gt;null&lt;/strong&gt;, то реализация должна вернуть список корневых элементов дерева. Вообще, это не очень хорошее решение, и, с точки зрения архитектуры, гораздо лучше иметь отдельный метод для получения корневых элементов дерева.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Реализацию репозитория пока отложим и реализуем необходимые интерфейсы для &lt;strong&gt;IHierarchicalDataSource&lt;/strong&gt; предполагая, что данные поступают к нам из некоторого репозитория &lt;strong&gt;IHierarchyDataRepository&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GenericHierarchicalDataSource.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Web&lt;span style="color: purple"&gt;.&lt;/span&gt;UI;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;sealed&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchicalDataSource&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color: #2b91af"&gt;IHierarchicalDataSource&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;where&lt;/span&gt; T : &lt;span style="color: blue"&gt;class&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; GenericHierarchicalDataSource(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;repository &lt;span style="color: purple"&gt;=&lt;/span&gt; repository;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IHierarchicalDataSource Members&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt; DataSourceChanged;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchicalDataSourceView&lt;/span&gt; GetHierarchicalView(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; viewPath)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchicalDataSourceView&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; repository, viewPath);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Итак, сам &lt;strong&gt;IHierarchicalDataSource&lt;/strong&gt; довольно примитивен: принимает в качестве параметров репозиторий и передаёт его дальше – реализации абстрактного &lt;strong&gt;HierarchicalDataSourceView&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GenericHierarchicalDataSourceView.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Web&lt;span style="color: purple"&gt;.&lt;/span&gt;UI;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;sealed&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchicalDataSourceView&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color: #2b91af"&gt;HierarchicalDataSourceView&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;where&lt;/span&gt; T : &lt;span style="color: blue"&gt;class&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; viewPath;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; GenericHierarchicalDataSourceView(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository, &lt;span style="color: blue"&gt;string&lt;/span&gt; viewPath)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;repository &lt;span style="color: purple"&gt;=&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;viewPath &lt;span style="color: purple"&gt;=&lt;/span&gt; viewPath;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchicalEnumerable&lt;/span&gt; Select()&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: purple"&gt;!&lt;/span&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;IsNullOrEmpty(viewPath))&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; hierarchyItem &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; repository, viewPath);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; hierarchyItem&lt;span style="color: purple"&gt;.&lt;/span&gt;GetChildren();&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchicalEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; repository, &lt;span style="color: blue"&gt;null&lt;/span&gt;, repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetChildren(&lt;span style="color: blue"&gt;null&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Здесь нужно обратить внимание на параметр конструктора &lt;strong&gt;viewPath&lt;/strong&gt;, который представляет собой начальный путь обхода иерархического источника данных.&lt;/p&gt;

&lt;p&gt;В остальном реализация &lt;strong&gt;GenericDataSourceView&lt;/strong&gt; также не представляет интереса, всё передаётся на откуп двум оставшимся интерфейсам.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GenericHierarchicalEnumerable.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections&lt;span style="color: purple"&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;sealed&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchicalEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color: #2b91af"&gt;HierarchicalEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;where&lt;/span&gt; T : &lt;span style="color: blue"&gt;class&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; parent;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; enumerableList;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; GenericHierarchicalEnumerable(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository,&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; parent,&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; enumerableList&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; )&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;repository &lt;span style="color: purple"&gt;=&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;parent &lt;span style="color: purple"&gt;=&lt;/span&gt; parent;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;enumerableList &lt;span style="color: purple"&gt;=&lt;/span&gt; enumerableList;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IHierarchicalEnumerable Members&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetHierarchyData(T item)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; repository, parent, item);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IEnumerable Members&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerator&lt;/span&gt; GetEnumerator()&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; enumerableList&lt;span style="color: purple"&gt;.&lt;/span&gt;GetEnumerator();&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Этот интерфейс представляет собой расширение абстракции IEnumerable – перечислимых данных – до абстракции перечисление дерева с возможностью продвижения от некоторого корневого элемента дерева до его листьев.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IHierarchicalEnumerable&lt;/strong&gt; отличается от обычного &lt;strong&gt;IEnumerable&lt;/strong&gt; только дополнительным методом &lt;em&gt;GetHierarchyData&lt;/em&gt;, который предназначен для конвертации перебираемых элементов в реализацию иерархической модели &lt;strong&gt;HierarchyData&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GenericHierarchyData.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections&lt;span style="color: purple"&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Linq;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;sealed&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;where&lt;/span&gt; T : &lt;span style="color: blue"&gt;class&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; T item;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; parent;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IList&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; children;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; path;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; type;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; GenericHierarchyData(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository,&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; itemPath)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;repository &lt;span style="color: purple"&gt;=&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;item &lt;span style="color: purple"&gt;=&lt;/span&gt; repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetItem(itemPath);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;parent &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;children &lt;span style="color: purple"&gt;=&lt;/span&gt; repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetChildren(item)&lt;span style="color: purple"&gt;.&lt;/span&gt;ToList();&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;path &lt;span style="color: purple"&gt;=&lt;/span&gt; itemPath;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;type &lt;span style="color: purple"&gt;=&lt;/span&gt; repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetItemType(item);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; GenericHierarchyData(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository,&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; parent,&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T item&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; )&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;repository &lt;span style="color: purple"&gt;=&lt;/span&gt; repository;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;item &lt;span style="color: purple"&gt;=&lt;/span&gt; item;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;parent &lt;span style="color: purple"&gt;=&lt;/span&gt; parent;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;children &lt;span style="color: purple"&gt;=&lt;/span&gt; repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetChildren(item)&lt;span style="color: purple"&gt;.&lt;/span&gt;ToList();&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;path &lt;span style="color: purple"&gt;=&lt;/span&gt; repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetItemHierarchyPath(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; parent &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt; &lt;span style="color: purple"&gt;?&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt; : parent&lt;span style="color: purple"&gt;.&lt;/span&gt;Path, item);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;type &lt;span style="color: purple"&gt;=&lt;/span&gt; repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetItemType(item);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IHierarchyData Members&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchyData&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetParent()&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; parent;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; HasChildren&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; children&lt;span style="color: purple"&gt;.&lt;/span&gt;Count &lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: red"&gt;0&lt;/span&gt;; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchicalEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetChildren()&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchicalEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; repository, &lt;span style="color: blue"&gt;this&lt;/span&gt;, children&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; );&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; T Item { &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; item; } }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Path { &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; path; } }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Type { &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; type; } }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;В реализации &lt;strong&gt;IHierarchyData&lt;/strong&gt; фактически выполняется конечное извлечение данных из нашей абстракции репозитория иерархических данных.&lt;/p&gt;

&lt;p&gt;Используется два конструктора: первый предназначен для создания объекта от некоторого начального пути &lt;strong&gt;itemPath&lt;/strong&gt; в дереве, второй создаёт текущий объект обхода.&lt;/p&gt;

&lt;p&gt;А теперь самое интересное, необходимо реализовать некоторый конечный репозиторий иерархических данных.&lt;/p&gt;

&lt;h4&gt;Реализация IHierarchyDataRepository&lt;/h4&gt;

&lt;p&gt;Так как настоящий слой данных обычно реализуется независимо от тех всяческих UI-биндингов, то мы будем представлять что где-то в слое данных уже есть реализованный набор операций доступа к хранилищу объектов.&lt;/p&gt;

&lt;p&gt;Вспоминаем наши первоначальные модели древовидных данных &lt;strong&gt;PlainTreeModel&lt;/strong&gt; и &lt;strong&gt;ORMTreeModel&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Для первой модели, интерфейс должен выглядеть примерно так:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IPlaneTreeModelRepository.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections&lt;span style="color: purple"&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IPlainTreeModelRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetRoots();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetItems(&lt;span style="color: blue"&gt;int&lt;/span&gt; parentID);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T GetItem(&lt;span style="color: blue"&gt;int&lt;/span&gt; id);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Но в этом примере я не буду использовать интерфейсы, а лучше воспользуюсь возможностями языка C# и представлю данный интерфейс в виде набора независимых функций высшего порядка.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: В качестве основных полей объекта предполагается существование полей &amp;quot;ID&amp;quot; и &amp;quot;ParentID&amp;quot;, если их в объекте не окажется, то возникнет ошибка времени выполнения.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PlainTreeModelRepository.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections&lt;span style="color: purple"&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PlainTreeModelRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;where&lt;/span&gt; T : &lt;span style="color: blue"&gt;class&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&amp;gt;&lt;/span&gt; getRootsImpl;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&amp;gt;&lt;/span&gt; getItemsById;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; getItemByIdImpl;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; PlainTreeModelRepository(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IPlainTreeModelRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; :&lt;span style="color: blue"&gt;this&lt;/span&gt;(repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetRoots, repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetItems, repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetItem)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; PlainTreeModelRepository(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&amp;gt;&lt;/span&gt; getRootsImpl,&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&amp;gt;&lt;/span&gt; getItemsById,&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; getItemByIdImpl)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;getRootsImpl &lt;span style="color: purple"&gt;=&lt;/span&gt; getRootsImpl;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;getItemsById &lt;span style="color: purple"&gt;=&lt;/span&gt; getItemsById;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;getItemByIdImpl &lt;span style="color: purple"&gt;=&lt;/span&gt; getItemByIdImpl;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; T GetItem(&lt;span style="color: blue"&gt;string&lt;/span&gt; path)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; pathItems &lt;span style="color: purple"&gt;=&lt;/span&gt; path&lt;span style="color: purple"&gt;.&lt;/span&gt;Split(&lt;span style="color: #a31515"&gt;'/'&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (pathItems&lt;span style="color: purple"&gt;.&lt;/span&gt;Length &lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: red"&gt;0&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;int&lt;/span&gt; itemID &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;Parse(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pathItems[pathItems&lt;span style="color: purple"&gt;.&lt;/span&gt;Length &lt;span style="color: purple"&gt;-&lt;/span&gt; &lt;span style="color: red"&gt;1&lt;/span&gt;]);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; getItemByIdImpl(itemID);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetChildren(T item)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (item &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; getRootsImpl();&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; getItemsById(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item&lt;span style="color: purple"&gt;.&lt;/span&gt;GetProperty&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;ID&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; );&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; T GetParent(T item)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (item &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;item&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; parentID &lt;span style="color: purple"&gt;=&lt;/span&gt; item&lt;span style="color: purple"&gt;.&lt;/span&gt;GetProperty&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;ParentID&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; getItemByIdImpl(parentID);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetItemHierarchyPath(&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; parentHierarchyPath, T item)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (parentHierarchyPath &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;parentHierarchyPath&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (item &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;item&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;Format(&lt;span style="color: #a31515"&gt;&amp;quot;{0}/{1}&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; parentHierarchyPath,&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item&lt;span style="color: purple"&gt;.&lt;/span&gt;GetProperty&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;ID&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetItemType(T item)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (item &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;item&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(T)&lt;span style="color: purple"&gt;.&lt;/span&gt;ToString();&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Для составления пути внутри иерархической структуры используется нотация в виде /RootID/…/ParentID/ItemID/ChildID. В качестве типа объектов используется CLR-тип этого объекта.&lt;/p&gt;

&lt;p&gt;Поля объектов извлекаются с помощью рефлексии (точнее TypeDescriptor'а) и следующего хелпера:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TypeDescriptorExtensions.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;ComponentModel;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;TypeDescriptorExtensions&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; TResult GetProperty&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;TResult&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt; &lt;span style="color: blue"&gt;object&lt;/span&gt; item,&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; propName)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; properties &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: #2b91af"&gt;TypeDescriptor&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;GetProperties(item);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; descriptor &lt;span style="color: purple"&gt;=&lt;/span&gt; properties&lt;span style="color: purple"&gt;.&lt;/span&gt;Find(propName, &lt;span style="color: blue"&gt;true&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (descriptor &lt;span style="color: purple"&gt;!=&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: purple"&gt;&amp;amp;&amp;amp;&lt;/span&gt; descriptor&lt;span style="color: purple"&gt;.&lt;/span&gt;PropertyType &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(TResult))&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; (TResult)descriptor&lt;span style="color: purple"&gt;.&lt;/span&gt;GetValue(item);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;InvalidOperationException&lt;/span&gt;(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;Format(&lt;span style="color: #a31515"&gt;&amp;quot;Property '{0}' with type '{1}' not found.&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propName, &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(TResult)));&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Аналогичным образом реализуем модель характерную для ORM.&lt;/p&gt;

&lt;p&gt;Интерфейс хранилища объектов, который нам понадобится будет выглядеть так:&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections&lt;span style="color: purple"&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IORMTreeModelRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetRoots();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T GetItem(&lt;span style="color: blue"&gt;int&lt;/span&gt; parentID);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Но опять же, использовать данный интерфейс мы не станем, а обойдёмся фукнциями высшего порядка в параметрах конструктора.&lt;/p&gt;

&lt;p&gt;Путь в иерархической структуре строится аналогично предыдущей модели.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Примечание: В качестве основных полей объекта предполагается существование полей &amp;quot;ID&amp;quot;, &amp;quot;Parent&amp;quot; и &amp;quot;Children&amp;quot;, если их в объекте не окажется, то возникнет ошибка времени выполнения.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ORMTreeModelRepository.cs&lt;/strong&gt;&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections&lt;span style="color: purple"&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ORMTreeModelRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color: #2b91af"&gt;IHierarchyDataRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;where&lt;/span&gt; T : &lt;span style="color: blue"&gt;class&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&amp;gt;&lt;/span&gt; getRootsImpl;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; getItemByIdImpl;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; ORMTreeModelRepository(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IORMTreeModelRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; repository)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color: blue"&gt;this&lt;/span&gt;(repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetRoots, repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetItem)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; ORMTreeModelRepository(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&amp;gt;&lt;/span&gt; getRootsImpl,&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;, T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; getItemImpl)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;getRootsImpl &lt;span style="color: purple"&gt;=&lt;/span&gt; getRootsImpl;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;getItemByIdImpl &lt;span style="color: purple"&gt;=&lt;/span&gt; getItemImpl;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; T GetItem(&lt;span style="color: blue"&gt;string&lt;/span&gt; path)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; pathItems &lt;span style="color: purple"&gt;=&lt;/span&gt; path&lt;span style="color: purple"&gt;.&lt;/span&gt;Split(&lt;span style="color: #a31515"&gt;'/'&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (pathItems&lt;span style="color: purple"&gt;.&lt;/span&gt;Length &lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: red"&gt;0&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;int&lt;/span&gt; itemID &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;Parse(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pathItems[pathItems&lt;span style="color: purple"&gt;.&lt;/span&gt;Length &lt;span style="color: purple"&gt;-&lt;/span&gt; &lt;span style="color: red"&gt;1&lt;/span&gt;]);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; getItemByIdImpl(itemID);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetChildren(T item)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (item &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; getRootsImpl();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; item&lt;span style="color: purple"&gt;.&lt;/span&gt;GetProperty&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Children&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; T GetParent(T item)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (item &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;item&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; item&lt;span style="color: purple"&gt;.&lt;/span&gt;GetProperty&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Parent&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetItemHierarchyPath(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; parentHierarchyPath, T item)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (parentHierarchyPath &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;parentHierarchyPath&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (item &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;item&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;&lt;span style="color: purple"&gt;.&lt;/span&gt;Format(&lt;span style="color: #a31515"&gt;&amp;quot;{0}/{1}&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; parentHierarchyPath,&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item&lt;span style="color: purple"&gt;.&lt;/span&gt;GetProperty&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;ID&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetItemType(T item)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (item &lt;span style="color: purple"&gt;==&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;item&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(T)&lt;span style="color: purple"&gt;.&lt;/span&gt;ToString();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Для более типизированного использования потребуется реализовать интерфейс иерархического репозитория для конкретного типа или ввести интерфейс, который должны будут поддерживать объекты из иерархического хранилища.&lt;/p&gt;

&lt;h4&gt;Пример использования&lt;/h4&gt;

&lt;p&gt;Предположим, что у нас есть база данных, которая содержит в себе иерархическую структуру отделов некоторой организации.&lt;/p&gt;

&lt;p&gt;Для доступа к этой БД будем использовать Entity Framework, модель будет выглядеть следующим образом:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Скриншот: Departments на диаграмме модели Entity Framework" border="0" alt="Скриншот: Departments на диаграмме модели Entity Framework" src="http://lh3.ggpht.com/_cqKDpMpIE24/SqzJY6ATq1I/AAAAAAAAAp4/wPaQ_Dul1ZQ/EntityFramework_DepartmentModel4.png?imgmax=800" width="502" height="498" /&gt; &lt;/p&gt;

&lt;p&gt;Реализуем слой данных для доступа к данным в этой таблице:&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Collections&lt;span style="color: purple"&gt;.&lt;/span&gt;Generic;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System&lt;span style="color: purple"&gt;.&lt;/span&gt;Linq;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;span style="color: purple"&gt;.&lt;/span&gt;Code&lt;span style="color: purple"&gt;.&lt;/span&gt;DataLayer&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DepartmentRepository&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;Department&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetDepartments()&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; context &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchicalDbEntities&lt;/span&gt;())&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; query &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;from&lt;/span&gt; d &lt;span style="color: blue"&gt;in&lt;/span&gt; context&lt;span style="color: purple"&gt;.&lt;/span&gt;DepartmentSet&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;where&lt;/span&gt; &lt;span style="color: purple"&gt;!&lt;/span&gt;d&lt;span style="color: purple"&gt;.&lt;/span&gt;ParentID&lt;span style="color: purple"&gt;.&lt;/span&gt;HasValue&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;select&lt;/span&gt; d;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; query&lt;span style="color: purple"&gt;.&lt;/span&gt;ToList();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;Department&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt; GetDepartments(&lt;span style="color: blue"&gt;int&lt;/span&gt; parentID)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; context &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchicalDbEntities&lt;/span&gt;())&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; query &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;from&lt;/span&gt; d &lt;span style="color: blue"&gt;in&lt;/span&gt; context&lt;span style="color: purple"&gt;.&lt;/span&gt;DepartmentSet&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;where&lt;/span&gt; d&lt;span style="color: purple"&gt;.&lt;/span&gt;ParentID&lt;span style="color: purple"&gt;.&lt;/span&gt;HasValue &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: purple"&gt;&amp;amp;&amp;amp;&lt;/span&gt; d&lt;span style="color: purple"&gt;.&lt;/span&gt;ParentID&lt;span style="color: purple"&gt;.&lt;/span&gt;Value &lt;span style="color: purple"&gt;==&lt;/span&gt; parentID&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;select&lt;/span&gt; d;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; query&lt;span style="color: purple"&gt;.&lt;/span&gt;ToList();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Department&lt;/span&gt; GetDepartment(&lt;span style="color: blue"&gt;int&lt;/span&gt; id)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; context &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;HierarchicalDbEntities&lt;/span&gt;())&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; query &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;from&lt;/span&gt; d &lt;span style="color: blue"&gt;in&lt;/span&gt; context&lt;span style="color: purple"&gt;.&lt;/span&gt;DepartmentSet&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;where&lt;/span&gt; d&lt;span style="color: purple"&gt;.&lt;/span&gt;ID &lt;span style="color: purple"&gt;==&lt;/span&gt; id&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;select&lt;/span&gt; d;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; query&lt;span style="color: purple"&gt;.&lt;/span&gt;First();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Сделаем страничку, на которой будем отображать организационную структуру:&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="background: #ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@&lt;/span&gt; &lt;span style="color: #a31515"&gt;Page&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;MasterPageFile&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;~/Shared/Site.Master&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;CodeBehind&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;TreeViewWithRepository.aspx.cs&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Home.Andir.Examples.TreeViewWithRepositoryPage&amp;quot;&lt;/span&gt; &lt;span style="background: #ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt; &lt;span style="color: red"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;BodyPlaceHolder&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeView&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;treeView&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataBindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeNodeBinding&lt;/span&gt; &lt;span style="color: red"&gt;ValueField&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;ID&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;TextField&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataBindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TreeView&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;и теперь в CodeBehind реализуем биндинг данных к &lt;strong&gt;DepartmentRepository&lt;/strong&gt;:&lt;/p&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;span style="color: purple"&gt;.&lt;/span&gt;Code&lt;span style="color: purple"&gt;.&lt;/span&gt;DataLayer;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; Home&lt;span style="color: purple"&gt;.&lt;/span&gt;Andir&lt;span style="color: purple"&gt;.&lt;/span&gt;Examples&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;partial&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;TreeViewWithRepositoryPage&lt;/span&gt; &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : System&lt;span style="color: purple"&gt;.&lt;/span&gt;Web&lt;span style="color: purple"&gt;.&lt;/span&gt;UI&lt;span style="color: purple"&gt;.&lt;/span&gt;&lt;span style="color: #2b91af"&gt;Page&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; repository &lt;span style="color: purple"&gt;=&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DepartmentRepository&lt;/span&gt;();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; treeView&lt;span style="color: purple"&gt;.&lt;/span&gt;DataSource &lt;span style="color: purple"&gt;=&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericHierarchicalDataSource&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;Department&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PlainTreeModelRepository&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;Department&lt;/span&gt;&lt;span style="color: purple"&gt;&amp;gt;&lt;/span&gt;(&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; () &lt;span style="color: purple"&gt;=&amp;gt;&lt;/span&gt; repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetDepartments(),&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item &lt;span style="color: purple"&gt;=&amp;gt;&lt;/span&gt; repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetDepartments(item&lt;span style="color: purple"&gt;.&lt;/span&gt;ID),&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; id &lt;span style="color: purple"&gt;=&amp;gt;&lt;/span&gt; repository&lt;span style="color: purple"&gt;.&lt;/span&gt;GetDepartment(id)));&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; treeView&lt;span style="color: purple"&gt;.&lt;/span&gt;DataBind();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Для проверки запускаем:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Скриншот: Результат выполнения TreeViewWithRepository" border="0" alt="Скриншот: Результат выполнения TreeViewWithRepository" src="http://lh3.ggpht.com/_cqKDpMpIE24/SqzJn-lLnfI/AAAAAAAAAp8/2KhHvdYbhcM/TreeViewWithRepository4.png?imgmax=800" width="472" height="362" /&gt; &lt;/p&gt;

&lt;p&gt;Вот, наконец-то, всё заработало :-)&lt;/p&gt;

&lt;p&gt;Полный проект с реализацией IHierarchicalDataSource можно взять &lt;a href="http://sites.google.com/site/andirnotes/blogfiles/HierarchicalDataSource.zip"&gt;здесь&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7550093075906678978-5727684102915237804?l=andir-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndirNotes/~4/XA2wYTDOYMY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andir-notes.blogspot.com/feeds/5727684102915237804/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://andir-notes.blogspot.com/2009/09/ihierarchicaldatasource-generic.html#comment-form" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/5727684102915237804?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/5727684102915237804?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AndirNotes/~3/XA2wYTDOYMY/ihierarchicaldatasource-generic.html" title="Реализация обобщённого варианта IHierarchicalDataSource" /><author><name>Andir</name><uri>http://www.blogger.com/profile/04945404879829884954</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_cqKDpMpIE24/SqzJIBBQBLI/AAAAAAAAApo/40aKrAmHrSk/s72-c/TreeTable4.png?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://andir-notes.blogspot.com/2009/09/ihierarchicaldatasource-generic.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcBRnk8eyp7ImA9WxNSE0U.&quot;"><id>tag:blogger.com,1999:blog-7550093075906678978.post-2690547713266031153</id><published>2009-08-25T17:36:00.001+04:00</published><updated>2009-08-27T19:47:37.773+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-27T19:47:37.773+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="prolog" /><title>Пролог: Изучение с нуля</title><content type="html">&lt;p&gt;Добрался таки до пролога. Чтобы не потерять, все источники собираю в одном месте.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Реализации&lt;/strong&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.swi-prolog.org/"&gt;SWI-Prolog&lt;/a&gt;,  &lt;li&gt;&lt;a href="http://www.gprolog.org/"&gt;GNU Prolog&lt;/a&gt;,  &lt;li&gt;&lt;a href="http://www.probp.com/"&gt;B Prolog&lt;/a&gt;,  &lt;li&gt;&lt;a href="http://www.sics.se/isl/sicstuswww/site/index.html"&gt;SICStus Prolog&lt;/a&gt; (платный, 30 дневный trial выдаётся по запросу),  &lt;li&gt;&lt;a href="http://www.dobrev.com/"&gt;Strawberry Prolog&lt;/a&gt; (Light версия распространяется бесплатно).&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Редакторы кода&lt;/strong&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;PceEmacs (встроенный Emacs для SWI-Prolog),  &lt;li&gt;&lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt; (&lt;a href="http://www.swi-prolog.org/FAQ/GnuEmacs.html"&gt;prolog-mode&lt;/a&gt;),  &lt;li&gt;&lt;a href="http://www.visual-prolog.com/"&gt;Visual Prolog&lt;/a&gt;,  &lt;li&gt;&lt;a href="http://sewiki.iai.uni-bonn.de/research/pdt/start"&gt;Prolog Development Tool for Eclipse&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Источники первичной информации&lt;/strong&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Prolog"&gt;Wikipedia: Prolog&lt;/a&gt;, &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Большая статья из которой можно почерпнуть практически всю доступную информацию о языке Prolog.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://en.wikibooks.org/wiki/Prolog"&gt;Wikibooks: Prolog&lt;/a&gt;, &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Очень хорошее начало, но, к сожалению, содержит пропуски в некоторых частях, для полноценного изучения не годится.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Prolog ISO/IEC 13211-1:1995 - стандарт языка, &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; В 1995 году был принят стандарт языка, но к сожалению в свободном доступе его обнаружить не удалось, есть только &lt;a href="http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/prolog/doc/standard/"&gt;черновик&lt;/a&gt; в PostScript формате.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://pauillac.inria.fr/~deransar/prolog/docs.html"&gt;Prolog: ISO Standard documents&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Набор документов и программ использованных при разработке стандарта языка.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Туториалы&lt;/strong&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/intro.html"&gt;Prolog Tutorial&lt;/a&gt;,  &lt;li&gt;&lt;a href="http://www.kuro5hin.org/print/2004/2/25/124713/784"&gt;A Prolog Introduction for Hackers&lt;/a&gt;, &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Книги&lt;/strong&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;"Программирование на языке Пролог", У. Клоксин К. Меллиш ("Programming in Prolog" by W.F. Clocksin and C.S. Mellish),  &lt;li&gt;&lt;a href="http://www.softcraft.ru/paradigm/dp/index.shtml"&gt;"Декларативное программирование"&lt;/a&gt;, И.А.Дехтяренко,  &lt;li&gt;Программирование на языке Пролог для искусственного интеллекта, И. Братко,  &lt;li&gt;&lt;a href="http://www.learnprolognow.org"&gt;Learn Prolog Now&lt;/a&gt; by Patrick Blackburn, Johan Bos and Kristina Striegnitz&amp;nbsp; (&lt;a href="http://cs.union.edu/~striegnk/learn-prolog-now/html/index.html"&gt;бесплатная онлайн-версия&lt;/a&gt;). &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Задачи&lt;/strong&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="https://prof.ti.bfh.ch/hew1/informatik3/prolog/p-99/"&gt;99 Prolog problems&lt;/a&gt;,&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Другое&lt;/strong&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://personnel.univ-reunion.fr/fred/Enseignement/Prolog/freestuff.html"&gt;Free stuff for programming in Prolog&lt;/a&gt;,  &lt;li&gt;&lt;a href="http://www.cse.unsw.edu.au/~billw/prologdict.html"&gt;The Prolog Dictionary&lt;/a&gt;,  &lt;li&gt;&lt;a href="http://www.cs.mu.oz.au/~lee/papers/ho/"&gt;Higher-order logic programming in Prolog&lt;/a&gt; (статья о программировании с правилами высшего порядка, сама статья в pdf лежит &lt;a href="http://www.cs.umbc.edu/771/papers/mu_96_02.pdf"&gt;отдельно&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt; &lt;h4&gt;Очень краткое введение&lt;/h4&gt; &lt;p&gt;Пролог – это декларативный логический язык программирования. Основными его конструкциями являются логические предложения (например: human('Socrat') :- true.), на основании которых пролог строит некоторые логические выводы. Предложения объединяются в правила с помощью операции and, которая обозначается знаком ','. Предложение при проверке может создавать побочные эффекты, что используется для ввода/вывода.&lt;/p&gt; &lt;h4&gt;Краткий путеводитель по синтаксису&lt;/h4&gt;&lt;pre style="background-color: #ffffff; font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;﻿&lt;span style="color: #006633"&gt;% Это строчный комментарий&lt;/span&gt;
&lt;span style="color: #006633"&gt;/* А это блочный комментарий */&lt;/span&gt;

&lt;span style="color: #d11ced"&gt;goal&lt;/span&gt;&lt;span style="color: #555555"&gt;(&lt;/span&gt;X&lt;span style="color: #555555"&gt;,&lt;/span&gt; Y&lt;span style="color: #555555"&gt;) :-&lt;/span&gt;   &lt;span style="color: #006633"&gt;% goal - это цель, для которой мы собираем правила,&lt;/span&gt;
                &lt;span style="color: #006633"&gt;% имя цели всегда начинается с маленькой буквы.&lt;/span&gt;
                &lt;span style="color: #006633"&gt;% результат у цели - это всегда true или false.&lt;/span&gt;
                &lt;span style="color: #006633"&gt;% X, Y - параметры цели.&lt;/span&gt;

    X &lt;span style="color: #555555"&gt;&amp;gt;&lt;/span&gt; Y       &lt;span style="color: #006633"&gt;% Первое утверждение, которое утверждает что X больше Y.&lt;/span&gt;

    &lt;span style="color: #555555"&gt;,&lt;/span&gt;           &lt;span style="color: #006633"&gt;% Разделитель между утверждениями, означает логическое И.&lt;/span&gt;

    X &lt;span style="color: #555555"&gt;+&lt;/span&gt; &lt;span style="color: #32ba06"&gt;1&lt;/span&gt; &lt;span style="color: #555555"&gt;==&lt;/span&gt; Y  &lt;span style="color: #006633"&gt;% Второе утверждение, которое может быть верным,&lt;/span&gt;
                &lt;span style="color: #006633"&gt;% только если Y = X + 1.&lt;/span&gt;

    &lt;span style="color: #555555"&gt;.&lt;/span&gt;           &lt;span style="color: #006633"&gt;% Точка означает конец описания цели.&lt;/span&gt;

&lt;span style="color: #006633"&gt;/*&lt;/span&gt;
&lt;span style="color: #006633"&gt; * Суммирую:&lt;/span&gt;
&lt;span style="color: #006633"&gt; * Имя цели всегда с маленькой буквы,&lt;/span&gt;
&lt;span style="color: #006633"&gt; * Параметры цели, и все другие переменные с большой буквы,&lt;/span&gt;
&lt;span style="color: #006633"&gt; * Утверждения разделяются запятой,&lt;/span&gt;
&lt;span style="color: #006633"&gt; * Описание цели всегда заканчивается точкой.&lt;/span&gt;
&lt;span style="color: #006633"&gt; */&lt;/span&gt;

&lt;span style="color: #d11ced"&gt;prolog&lt;/span&gt;&lt;span style="color: #555555"&gt;(&lt;/span&gt;&lt;span style="color: #1861a7"&gt;'logic language'&lt;/span&gt;&lt;span style="color: #555555"&gt;).&lt;/span&gt;
&lt;span style="color: #006633"&gt;% Так записываются некоторые факты,&lt;/span&gt;
&lt;span style="color: #006633"&gt;% и по сути являются сокращениями для цели,&lt;/span&gt;
&lt;span style="color: #006633"&gt;% которая всегда возвращает true.&lt;/span&gt;
&lt;span style="color: #006633"&gt;% в данном случае эквивалент выглядел бы так:&lt;/span&gt;
&lt;span style="color: #006633"&gt;% prolog('logic language') :- true.&lt;/span&gt;

&lt;span style="color: #006633"&gt;% Цели могут быть рекурсивными.&lt;/span&gt;
&lt;span style="color: #006633"&gt;% Посчитаем сумму от 0 до X.&lt;/span&gt;
&lt;span style="color: #d11ced"&gt;sum&lt;/span&gt;&lt;span style="color: #555555"&gt;(&lt;/span&gt;&lt;span style="color: #32ba06"&gt;0&lt;/span&gt;&lt;span style="color: #555555"&gt;,&lt;/span&gt; &lt;span style="color: #32ba06"&gt;0&lt;/span&gt;&lt;span style="color: #555555"&gt;).&lt;/span&gt;   &lt;span style="color: #006633"&gt;% факт используется для остановки рекурсии.&lt;/span&gt;
&lt;span style="color: #d11ced"&gt;sum&lt;/span&gt;&lt;span style="color: #555555"&gt;(&lt;/span&gt;X&lt;span style="color: #555555"&gt;,&lt;/span&gt; Result&lt;span style="color: #555555"&gt;) :-&lt;/span&gt;
    Y &lt;span style="color: #ff3030"&gt;is&lt;/span&gt; X &lt;span style="color: #555555"&gt;-&lt;/span&gt; &lt;span style="color: #32ba06"&gt;1&lt;/span&gt;&lt;span style="color: #555555"&gt;,&lt;/span&gt;             &lt;span style="color: #006633"&gt;% is - это по сути присвоение значения.&lt;/span&gt;
    &lt;span style="color: #d11ced"&gt;sum&lt;/span&gt;&lt;span style="color: #555555"&gt;(&lt;/span&gt;Y&lt;span style="color: #555555"&gt;,&lt;/span&gt; SubResult&lt;span style="color: #555555"&gt;),&lt;/span&gt;      &lt;span style="color: #006633"&gt;% Рекурсивный вызов.&lt;/span&gt;
    Result &lt;span style="color: #ff3030"&gt;is&lt;/span&gt; X &lt;span style="color: #555555"&gt;+&lt;/span&gt; SubResult&lt;span style="color: #555555"&gt;.&lt;/span&gt;


&lt;span style="color: #006633"&gt;% Цель, которая будет использоваться при запуске программы,&lt;/span&gt;
&lt;span style="color: #006633"&gt;% имя 'main' выбрано мною произвольно.&lt;/span&gt;
main &lt;span style="color: #555555"&gt;:-&lt;/span&gt;
    &lt;span style="color: #006633"&gt;% запрашиваем значение факта&lt;/span&gt;
    &lt;span style="color: #d11ced"&gt;prolog&lt;/span&gt;&lt;span style="color: #555555"&gt;(&lt;/span&gt;Which&lt;span style="color: #555555"&gt;),&lt;/span&gt;
    &lt;span style="color: #006633"&gt;% выводим значение на экран&lt;/span&gt;
    &lt;span style="color: #d11ced"&gt;format&lt;/span&gt;&lt;span style="color: #555555"&gt;(&lt;/span&gt;&lt;span style="color: #1861a7"&gt;'prolog is a ~a.'&lt;/span&gt;&lt;span style="color: #555555"&gt;, [&lt;/span&gt;Which&lt;span style="color: #555555"&gt;]),&lt;/span&gt;

    &lt;span style="color: #006633"&gt;% newline&lt;/span&gt;
    &lt;span style="color: #ff3030"&gt;nl&lt;/span&gt;&lt;span style="color: #555555"&gt;,&lt;/span&gt;

    &lt;span style="color: #006633"&gt;% задаём значение X&lt;/span&gt;
    X &lt;span style="color: #ff3030"&gt;is&lt;/span&gt; &lt;span style="color: #32ba06"&gt;100&lt;/span&gt;&lt;span style="color: #555555"&gt;,&lt;/span&gt;
    &lt;span style="color: #006633"&gt;% считаем сумму от 0 до 100&lt;/span&gt;
    &lt;span style="color: #d11ced"&gt;sum&lt;/span&gt;&lt;span style="color: #555555"&gt;(&lt;/span&gt;X&lt;span style="color: #555555"&gt;,&lt;/span&gt; Result&lt;span style="color: #555555"&gt;),&lt;/span&gt;
    &lt;span style="color: #006633"&gt;% выводим результат с помощью printf-like функции&lt;/span&gt;
    &lt;span style="color: #d11ced"&gt;format&lt;/span&gt;&lt;span style="color: #555555"&gt;(&lt;/span&gt;&lt;span style="color: #1861a7"&gt;'sum(0, ~a) = ~a.'&lt;/span&gt;&lt;span style="color: #555555"&gt;, [&lt;/span&gt;X&lt;span style="color: #555555"&gt;,&lt;/span&gt; Result&lt;span style="color: #555555"&gt;]),&lt;/span&gt;

    &lt;span style="color: #006633"&gt;% newline.&lt;/span&gt;
    &lt;span style="color: #ff3030"&gt;nl&lt;/span&gt;&lt;span style="color: #555555"&gt;.&lt;/span&gt;

&lt;span style="color: #006633"&gt;/*&lt;/span&gt;
&lt;span style="color: #006633"&gt; * Вывод программы при запуске:&lt;/span&gt;
&lt;span style="color: #006633"&gt; * prolog is a logic language.&lt;/span&gt;
&lt;span style="color: #006633"&gt; * sum(0, 100) = 5050.&lt;/span&gt;
&lt;span style="color: #006633"&gt; */&lt;/span&gt;
&lt;/pre&gt;
&lt;h4&gt;Типы данных&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Атом&lt;/strong&gt;: атом или 'атом', начинается с маленькой буквы или обрамляется одинарными кавычками.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Строка&lt;/strong&gt;: "Строка", обрамляется двойными кавычками, по факту представляет список из чисел – кодов ASCII символов строки.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Число&lt;/strong&gt;: 10, целые (-1,0,1), плавающая запятая (0.123, 123.456).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Список&lt;/strong&gt;: [0, 1, 2], набор элементов перечисленных через запятую и обрамлённых квадратными скобками. Элементы могут быть разнородными (разных типов). Списки можно деструктурировать через синтаксис [Head | Tail].&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Первые результаты&lt;/h4&gt;
&lt;p&gt;Теперь, с помощью новоприобретённых знаний, можно написать несколько известных примеров:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HelloWorld.pro&lt;/strong&gt;:&lt;/p&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 12px 0px; -qt-block-indent: 0"&gt;&lt;span style="background-color: #ffffff; font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;main &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;:-&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;writeln&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #1861a7; font-size: 11pt"&gt;'Hello, Prolog World!'&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt; &lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Factorial.pro&lt;/strong&gt;:&lt;/p&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 12px 0px 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #006633; font-size: 11pt"&gt;% factorial implementation&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;factorial&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;factorial&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;) :-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    X &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;0&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    X1 &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #ff3030; font-size: 11pt"&gt;is&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; X &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;-&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;factorial&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    Result &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #ff3030; font-size: 11pt"&gt;is&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; X &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;*&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; font-family: 'Consolas'; color: #555555; font-size: 11pt; -qt-block-indent: 0; -qt-paragraph-type: empty"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;main &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;:-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;factorial&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;7&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;writeln&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt; &lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0"&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Fibonachi.pro&lt;/strong&gt;:&lt;/p&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 12px 0px 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #006633; font-size: 11pt"&gt;% Fibbonachi sequence implementation&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;fib&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;0&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;fib&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;fib&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;) :-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    X1 &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #ff3030; font-size: 11pt"&gt;is&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; X &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;-&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    X2 &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #ff3030; font-size: 11pt"&gt;is&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; X &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;-&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;2&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;fib&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;fib&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X2&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result2&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    Result &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #ff3030; font-size: 11pt"&gt;is&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result1 &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;+&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result2&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; font-family: 'Consolas'; color: #555555; font-size: 11pt; -qt-block-indent: 0; -qt-paragraph-type: empty"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;main &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;:-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;fib&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;7&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;writeln&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt; &lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0"&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QuickSort.pro:&lt;/strong&gt;&lt;/p&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 12px 0px 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;qsort&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;([], []).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;qsort&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;([&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;], [&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;]).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;qsort&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;([&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;|&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Tail&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;],&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;) :-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;partition&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Head&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Tail&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Left&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;qsort&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Left&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; LeftSorted&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;qsort&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; RightSorted&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;append&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;LeftSorted&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;, [&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;|&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; RightSorted&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;],&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; font-family: 'Consolas'; color: #555555; font-size: 11pt; -qt-block-indent: 0; -qt-paragraph-type: empty"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;partition&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;_&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;, [], [], []).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;partition&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Pivot&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;, [&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;|&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Tail&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;], [&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;|&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Left&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;],&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;) :-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;=&amp;lt;&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Pivot&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;partition&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Pivot&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Tail&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Left&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;partition&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Pivot&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;, [&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;|&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Tail&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;],&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Left&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;, [&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;|&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;]) :-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Pivot&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;partition&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Pivot&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Tail&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Left&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; font-family: 'Consolas'; color: #555555; font-size: 11pt; -qt-block-indent: 0; -qt-paragraph-type: empty"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;append&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;([],&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;append&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;([&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;|&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Left&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;],&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;, [&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Head &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;|&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;]) :-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;append&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;Left&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Right&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; Result&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; font-family: 'Consolas'; color: #555555; font-size: 11pt; -qt-block-indent: 0; -qt-paragraph-type: empty"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;main &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;:-&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;qsort&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;([&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;1&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;5&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;4&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;6&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;3&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;,&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #32ba06; font-size: 11pt"&gt;2&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;],&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt; X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;),&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; text-indent: 0px; margin: 0px 0px 12px; -qt-block-indent: 0"&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;    &lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #d11ced; font-size: 11pt"&gt;writeln&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;(&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #330066; font-size: 11pt"&gt;X&lt;/span&gt;&lt;span style="font-family: 'Consolas'; color: #555555; font-size: 11pt"&gt;).&lt;/span&gt; &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Какие ещё есть логические языки программирования?&lt;/h4&gt;
&lt;p&gt;Путём &lt;a href="http://google.com/search?q=programming+logical+language"&gt;нехитрых&lt;/a&gt; поисков в источниках близким к прологу собрал такой список:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.curry-language.org/"&gt;Curry Language&lt;/a&gt;, "A Truly Integrated Functional Logic Language":&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Расширение языка Haskell для реализации логического программирования.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.cs.mu.oz.au/research/mercury/index.html"&gt;Mercury Project&lt;/a&gt;, &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mercury is a new logic/functional programming language, which combines the clarity and expressiveness of declarative programming with advanced static analysis and error detection features. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.mozart-oz.org/"&gt;Oz Language&lt;/a&gt;, &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Мультипарадигменный язык, который включает в себя подмножество логического программирования.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.informatik.uni-kiel.de/~mh/systems/ALF.html"&gt;ALF – Algebraic logical functional language&lt;/a&gt;,&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Язык, комбинирующий функциональное и логическое программирование. По описанию сильно похоже, что к базе логического программирования добавлены функциональные возможности (функции, операторы, типы, структуры и т.п.).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7550093075906678978-2690547713266031153?l=andir-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndirNotes/~4/RdJcmGk1MyE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andir-notes.blogspot.com/feeds/2690547713266031153/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://andir-notes.blogspot.com/2009/08/prolog-getting-started.html#comment-form" title="Комментарии: 4" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/2690547713266031153?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7550093075906678978/posts/default/2690547713266031153?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AndirNotes/~3/RdJcmGk1MyE/prolog-getting-started.html" title="Пролог: Изучение с нуля" /><author><name>Andir</name><uri>http://www.blogger.com/profile/04945404879829884954</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total><feedburner:origLink>http://andir-notes.blogspot.com/2009/08/prolog-getting-started.html</feedburner:origLink></entry></feed>

