<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://winfs.ru/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Gollum&amp;#39;s den</title><subtitle type="html">ASP.NET (и не только) здесь и сейчас!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.linkedin.com/in/eugeneagafonov"&gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_liprofile_blue_80x15.gif" width="80" height="15" border="0" alt="View Eugene Agafonov&amp;#39;s profile on LinkedIn" /&gt;&lt;/a&gt;</subtitle><id>http://winfs.ru/blogs/gollum/atom.aspx</id><link rel="alternate" type="text/html" href="http://winfs.ru/blogs/gollum/default.aspx" /><link rel="self" type="application/atom+xml" href="http://winfs.ru/blogs/gollum/atom.aspx" /><generator uri="http://communityserver.org" version="4.1.30929.2835">Community Server</generator><updated>2007-08-20T16:18:00Z</updated><entry><title>Мой доклад про С# 4.0 на .NET User Group</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2010/09/02/charp-4-what-new.aspx" /><id>/blogs/gollum/archive/2010/09/02/charp-4-what-new.aspx</id><published>2010-09-02T12:12:00Z</published><updated>2010-09-02T12:12:00Z</updated><content type="html">&lt;p&gt;В ближайший вторник (7 сентября 2010 года) я буду выступать на встрече московской .Net User Group, где подробно расскажу про нововведения в языке С# 4.0&lt;/p&gt;
&lt;p&gt;Узнать больше об этом мероприятии и зарегистрироваться можно здесь:&lt;br /&gt;&lt;a href="http://mdna.ineta.ru/events/eventMultiSessionInfo.aspx?Id=45301f7e-28a3-4626-a84b-afb6d1108fb5"&gt;http://mdna.ineta.ru/events/eventMultiSessionInfo.aspx?Id=45301f7e-28a3-4626-a84b-afb6d1108fb5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Тем кому интересно, но придти затруднительно, есть возможность&amp;nbsp;&lt;a href="http://winfs.ru/controlpanel/blogs/posteditor.aspx/"&gt;посмотреть мой доклад онлайн на сайте techdays.ru&lt;/a&gt;. Конечно, для посетителей user group я расскажу несколько больше, но все основные моменты в онлайн-докладе присутствуют.&lt;/p&gt;
&lt;p&gt;После доклада исчезать не планирую, так что с удовольствием пообщаюсь и отвечу на вопросы, если такие будут.&lt;/p&gt;
&lt;p&gt;Приходите, будет интересно!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=34939" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term=".Net" scheme="http://winfs.ru/blogs/gollum/archive/tags/.Net/default.aspx" /><category term="Evangelism" scheme="http://winfs.ru/blogs/gollum/archive/tags/Evangelism/default.aspx" /><category term="C# 4.0" scheme="http://winfs.ru/blogs/gollum/archive/tags/C_2300_+4.0/default.aspx" /><category term="C#" scheme="http://winfs.ru/blogs/gollum/archive/tags/C_2300_/default.aspx" /></entry><entry><title>OpenXML SDK 2.0 RTM.</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2010/04/08/openxml-sdk-2-0-rtm.aspx" /><id>/blogs/gollum/archive/2010/04/08/openxml-sdk-2-0-rtm.aspx</id><published>2010-04-08T14:30:49Z</published><updated>2010-04-08T14:30:49Z</updated><content type="html">&lt;div style="font-family:verdana;background:white;color:black;font-size:8pt;"&gt;   &lt;p style="margin:0px;"&gt;Делаю очередную попытку вернуться к написанию чего-то полезного в блог. К сожалению, времени катастрофически не хватает, но буду делать все возможное :)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;Итак, всеобщее внимание приковано к грядущему выходу семейства продуктов для разработки нового поколения, под грифом %Product_Name% 2010. Но я, будучи верным поклонником творчества Monty Python, расскажу про нечто совершенно другое.&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;Вышел (уже довольно давно, так что это не новость) &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c6e744e5-36e9-45f5-8d8c-331df206e0d0&amp;amp;displaylang=en" target="_blank"&gt;релиз OpenXML SDK 2.0&lt;/a&gt;. С помощью этого SDK можно генерировать документы офиса без автоматизации офисных приложений. По сути дела, взяли xml-схему, и сгенерировали по ней объектную модель,&amp;#160; а потом немного причесали. В результате, пока пользоваться не очень удобно, но неплохо поддерживается сценарий с использованием шаблонов. Можно взять заготовку отчета, вставить в нужные места данные с помощью SDK, и – отчет готов.&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;Также в состав SDK входит очень полезная утилита, Productivity Tool. Это по сути дела reflector для офисных документов. В ней можно открыть документ и сгенерировать код, который создает его, или часть документа. Можно посмотреть иерархию, что от чего зависит, сравнить два документа и найти различия.      &lt;br /&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;Здесь я уже писал про OpenXML SDK, поэтому особо повторяться не буду и просто приведу еще один code snippet. Здесь мы добавляем метод-расширение к типу из SDK, и у объекта типа TableColumn появляется метод SetColumnName. Проще сделать у меня не получилось, поэтому убедительная просьба – если заметите ошибки, или возможность сделать лучше, пожалуйста напишите об этом.&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Дополнительная функциональность для типа &lt;/span&gt;&lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;&amp;lt;see cref=&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;quot;TableColumn&amp;quot;&lt;/span&gt;&lt;span style="background:#f5fafa;color:#5c9b9b;"&gt; /&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt; из OpenXML SDK&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000096;font-weight:bold;"&gt;static&lt;/span&gt; &lt;span style="color:#000096;font-weight:bold;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TableColumnExtensions&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Задать имя колонки таблицы&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;&amp;lt;param name=&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;quot;column&amp;quot;&lt;/span&gt;&lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;колонка таблицы&lt;/span&gt;&lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;&amp;lt;param name=&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;имя колонки&lt;/span&gt;&lt;span style="background:#f5fafa;color:#5c9b9b;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000096;font-weight:bold;"&gt;static&lt;/span&gt; &lt;span style="color:#000096;font-weight:bold;"&gt;void&lt;/span&gt; SetColumnName(&lt;span style="color:#000096;font-weight:bold;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TableColumn&lt;/span&gt; column, &lt;span style="color:#000096;font-weight:bold;"&gt;string&lt;/span&gt; name)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;if&lt;/span&gt; (&lt;span style="color:#000096;font-weight:bold;"&gt;null&lt;/span&gt; == column) &lt;span style="color:#000096;font-weight:bold;"&gt;throw&lt;/span&gt; &lt;span style="color:#000096;font-weight:bold;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:blue;"&gt;&amp;quot;column&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;if&lt;/span&gt; (&lt;span style="color:#000096;font-weight:bold;"&gt;null&lt;/span&gt; == name) &lt;span style="color:#000096;font-weight:bold;"&gt;throw&lt;/span&gt; &lt;span style="color:#000096;font-weight:bold;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:blue;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; column.Name = name;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;var&lt;/span&gt; table = column.Ancestors&amp;lt;&lt;span style="color:#2b91af;"&gt;Table&lt;/span&gt;&amp;gt;().Single();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;var&lt;/span&gt; tablePart = table.TableDefinitionPart;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;var&lt;/span&gt; doc = (&lt;span style="color:#2b91af;"&gt;SpreadsheetDocument&lt;/span&gt;)tablePart.OpenXmlPackage;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;var&lt;/span&gt; workbookPart = doc.WorkbookPart;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// находим соответствующий таблице worksheetPart&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// для этого выбираем из WorksheetParts ту часть, у которой&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// есть tableDefinitionPart, соответствующая нашей таблице&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;var&lt;/span&gt; targetPart = workbookPart.WorksheetParts.Where(&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wp =&amp;gt; wp.GetPartsOfType&amp;lt;&lt;span style="color:#2b91af;"&gt;TableDefinitionPart&lt;/span&gt;&amp;gt;()&lt;/p&gt;    &lt;p 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; .Where(tdp =&amp;gt; tdp == tablePart).Count() == 1)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .SingleOrDefault();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// Если worksheetPart не обнаружен, то просто ничего не делаем&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// возможно, здесь лучше использовать Exception&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;if&lt;/span&gt; (&lt;span style="color:#000096;font-weight:bold;"&gt;null&lt;/span&gt; == targetPart) &lt;span style="color:#000096;font-weight:bold;"&gt;return&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// В tableReference хранится запись вида A1:B5, где А1 - верхняя левая ячейка таблицы,&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// а B5 - нижняя правая. Нам нужна верхняя левая, как первая ячейка строки заголовка.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// пустым и без двоеточия это значение не может быть никак&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;string&lt;/span&gt; firstTableCellName = table.Reference.Value.Split(&lt;span style="color:blue;"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;)[0];&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// Находим верхнюю левую ячейку в объектной модели&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Cell&lt;/span&gt; firstHeaderCell = targetPart.Worksheet.Descendants&amp;lt;&lt;span style="color:#2b91af;"&gt;Cell&lt;/span&gt;&amp;gt;()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Where(&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c =&amp;gt; &lt;span style="color:#000096;font-weight:bold;"&gt;string&lt;/span&gt;.Equals(c.CellReference, firstTableCellName,&lt;/p&gt;    &lt;p 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; &lt;span style="color:#2b91af;"&gt;StringComparison&lt;/span&gt;.InvariantCultureIgnoreCase))&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Single();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// Получаем строку заголовка, и выбираем из нее ячейку, соответствующую нашей колонке&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// не уверен что Id колонки это правильный способ узнать номер ячейки в строке, но&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// пока другого способа нет, а колонки всегда идут последовательно&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;var&lt;/span&gt; headerRow = firstHeaderCell.Ancestors&amp;lt;&lt;span style="color:#2b91af;"&gt;Row&lt;/span&gt;&amp;gt;().Single();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;var&lt;/span&gt; headerCells = headerRow.Descendants&amp;lt;&lt;span style="color:#2b91af;"&gt;Cell&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;var&lt;/span&gt; headerCell = headerCells.ElementAtOrDefault((&lt;span style="color:#000096;font-weight:bold;"&gt;int&lt;/span&gt;)column.Id.Value - 1);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;if&lt;/span&gt; (headerCell.DataType != &lt;span style="color:#2b91af;"&gt;CellValues&lt;/span&gt;.SharedString)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// Если в ячейке данные не из SharedStringPart, то просто устанавливаем ее текст&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; headerCell.CellValue.Text = name;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;else&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// Если в ячейке номер ресурса из SharedStringPart, то находим SharedStringPart,&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// находим ресурс по номеру, и изменяем его значение&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;var&lt;/span&gt; elementNumber = &lt;span style="color:#2b91af;"&gt;Convert&lt;/span&gt;.ToInt32(headerCell.CellValue.Text);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;var&lt;/span&gt; sharedStringsPart = workbookPart.GetPartsOfType&amp;lt;&lt;span style="color:#2b91af;"&gt;SharedStringTablePart&lt;/span&gt;&amp;gt;().Single();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;var&lt;/span&gt; stringTable = sharedStringsPart.SharedStringTable;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;var&lt;/span&gt; items = stringTable.Descendants&amp;lt;&lt;span style="color:#2b91af;"&gt;SharedStringItem&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#000096;font-weight:bold;"&gt;var&lt;/span&gt; ourItem = items.ElementAt(elementNumber);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ourItem.Text.Text = name;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// сохраняем изменения в SharedStringPart&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; stringTable.Save(sharedStringsPart);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160; }&lt;/p&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=25368" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term=".Net" scheme="http://winfs.ru/blogs/gollum/archive/tags/.Net/default.aspx" /><category term="Evangelism" scheme="http://winfs.ru/blogs/gollum/archive/tags/Evangelism/default.aspx" /><category term="OpenXML SDK" scheme="http://winfs.ru/blogs/gollum/archive/tags/OpenXML+SDK/default.aspx" /></entry><entry><title>Дело о пропавшей сессии</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2009/10/27/23761.aspx" /><id>/blogs/gollum/archive/2009/10/27/23761.aspx</id><published>2009-10-27T18:06:52Z</published><updated>2009-10-27T18:06:52Z</updated><content type="html">&lt;p&gt;Сегодня был выловлен совершенно эпический баг. Симптомы вкратце – в веб-приложении пропадала сессия. При этом, если на сервак заходить по айпишнику, все работало. В дело пошли фиддлер, лучшие умы и руки :)&lt;/p&gt;  &lt;p&gt;После третьего часа поисков, решили сделать перерывчик и спокойно подумать. И в процессе обдумывания, вот что попалось на глаза:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/bleroy/archive/2004/08/03/Don_2700_t-redirect-after-setting-a-Session-variable-_2800_or-do-it-right_2900_.aspx"&gt;http://weblogs.asp.net/bleroy/archive/2004/08/03/Don_2700_t-redirect-after-setting-a-Session-variable-_2800_or-do-it-right_2900_.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Цитирую феерический абзац:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;UPDATE 2:&lt;/strong&gt; Another thing that can cause similar problems is if your server has a name that contains underscores. Underscores are not allowed in host names by &lt;a href="http://www.ietf.org/rfc/rfc952.txt"&gt;RFC 952&lt;/a&gt; and may interfere with the ability to set cookies and thus to persist sessions.&lt;/p&gt;  &lt;p&gt;Подчеркивание из имени сервера убрали :)&lt;/p&gt;  &lt;p&gt;P.S. Не используйте сессию в ваших веб-приложениях. Считайте это best practice :)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=23761" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="ASP.NET" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET/default.aspx" /><category term="Fun" scheme="http://winfs.ru/blogs/gollum/archive/tags/Fun/default.aspx" /><category term="Evangelism" scheme="http://winfs.ru/blogs/gollum/archive/tags/Evangelism/default.aspx" /></entry><entry><title>C# 4.0: Мультиметоды</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2009/10/24/c-4-0.aspx" /><id>/blogs/gollum/archive/2009/10/24/c-4-0.aspx</id><published>2009-10-24T01:05:00Z</published><updated>2009-10-24T01:05:00Z</updated><content type="html">&lt;p&gt;С появлением в С# 4 dynamic нам уже рассказали как здорово можно будет работать с COM-объектами, и динамическими языками. Однако, с помощью dynamic можно делать и совершенно другие интересные вещи :)&lt;/p&gt;
&lt;p&gt;Итак, что же такое мультиметоды. В сети много информации, однако подана она совершенно зубодробительным и непонятным образом, со страшными словами типа multiple dispatching.&lt;/p&gt;
&lt;p&gt;По-хорошему, слова эти надо знать. Хотя есть и другие мнения на этот счет. Недавно вот прочитал на веселом ресурсе habrahabr.ru про то, что &lt;a target="_blank" href="http://habrahabr.ru/blogs/macosxdev/72510/"&gt;&amp;ldquo;Паттерны &amp;ndash; это рутины, для тех, кто не умеет программировать&amp;rdquo;&lt;/a&gt;. Рекомендую к прочтению, хорошее настроение обеспечено.&lt;/p&gt;
&lt;p&gt;Самое простое определение мультиметодов, которое мне доводилось видеть, звучало так: &lt;em&gt;Мультиметоды &amp;ndash; это виртуальные методы, принадлежащие сразу нескольким классам. &lt;/em&gt;А объяснять долго не буду, просто посмотрите на код&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:#2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Linq;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; NewC4FeaturesTest&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6&lt;/span&gt; { &lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;A&lt;/span&gt; {}&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;B&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;A&lt;/span&gt; {}&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 10&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 11&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;C&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;A&lt;/span&gt; {}&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 12&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 13&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Program&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 14&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 15&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 16&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 17&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Program&lt;/span&gt;.Dispatch(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;B&lt;/span&gt;(), &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;C&lt;/span&gt;());&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 18&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.ReadLine();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 19&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 20&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 21&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;void&lt;/span&gt; Dispatch(&lt;span style="color:#2b91af;"&gt;A&lt;/span&gt; a, &lt;span style="color:#2b91af;"&gt;A&lt;/span&gt; b)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 22&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 23&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;dynamic&lt;/span&gt; x = a;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;dynamic&lt;/span&gt; y = b;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 25&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; multiMethod(a, b);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 26&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; multiMethod(x, y);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 27&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 28&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 29&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;void&lt;/span&gt; multiMethod(&lt;span style="color:#2b91af;"&gt;A&lt;/span&gt; a, &lt;span style="color:#2b91af;"&gt;A&lt;/span&gt; b)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 30&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 31&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;A and A&amp;quot;&lt;/span&gt;));&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 32&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 33&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 34&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;void&lt;/span&gt; multiMethod(&lt;span style="color:#2b91af;"&gt;B&lt;/span&gt; a, &lt;span style="color:#2b91af;"&gt;A&lt;/span&gt; b)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 35&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 36&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;B and A&amp;quot;&lt;/span&gt;));&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 37&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 38&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 39&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;void&lt;/span&gt; multiMethod(&lt;span style="color:#2b91af;"&gt;A&lt;/span&gt; a, &lt;span style="color:#2b91af;"&gt;C&lt;/span&gt; b)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 40&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 41&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;A and C&amp;quot;&lt;/span&gt;));&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 42&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 43&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 44&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;void&lt;/span&gt; multiMethod(&lt;span style="color:#2b91af;"&gt;B&lt;/span&gt; a, &lt;span style="color:#2b91af;"&gt;C&lt;/span&gt; b)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 45&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 46&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;B and C&amp;quot;&lt;/span&gt;));&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 47&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 48&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;&amp;nbsp;&amp;nbsp; 49&lt;/span&gt; }&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Если у вас уже установлена Beta 2 Visual Studio 2010, можно скопипастить код, и посмотреть как он работает. Первый вызов всегда приведет к работе метода на строке 29 (&amp;ldquo;A and A&amp;rdquo;), по понятным причинам. А вот второй вызов в рантайме разберется, что надо вызвать метод на строке 44 (&amp;ldquo;B and C&amp;rdquo;). &lt;/p&gt;
&lt;p&gt;Таким образом, можно избежать if&amp;rsquo;ов и switch&amp;rsquo;ей. Некоторые даже говорят, что это практически pattern matching light.&lt;/p&gt;
&lt;p&gt;Однако, есть и темная сторона :) Если мы закомментируем строки 39 &amp;ndash; 47, то второй вызов выведет нам &amp;ldquo;B and A&amp;rdquo; (строка 34). Понятно, почему это происходит &amp;ndash; этот метод более специфичен, чем &amp;ldquo;A and A&amp;rdquo;. Однако, если мы раскомментируем 39 &amp;ndash; 42, то второй вызов приведет к выбросу исключения. Потому что непонятно, какое совпадение аргумента важнее &amp;ndash; B, или С.&lt;/p&gt;
&lt;p&gt;Именно по такой причине прогрессивное человечество придумало Visitor. При этом мы должны гарантированно описать все комбинации, иначе компилятор даст нам по рукам. Но реализацию паттерна простой не назовешь.&lt;/p&gt;
&lt;p&gt;Если все это показалось вам интересным, в следующий раз приведу реализацию Visitor с помощью dynamic.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=23760" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="Programming" scheme="http://winfs.ru/blogs/gollum/archive/tags/Programming/default.aspx" /><category term="Evangelism" scheme="http://winfs.ru/blogs/gollum/archive/tags/Evangelism/default.aspx" /><category term="Visual Studio 2010" scheme="http://winfs.ru/blogs/gollum/archive/tags/Visual+Studio+2010/default.aspx" /><category term="C# 4.0" scheme="http://winfs.ru/blogs/gollum/archive/tags/C_2300_+4.0/default.aspx" /></entry><entry><title>Visual Studio 2010 Beta 2: CopySourceAsHtml</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2009/10/22/visual-studio-2010-beta-2-copysourceashtml.aspx" /><id>/blogs/gollum/archive/2009/10/22/visual-studio-2010-beta-2-copysourceashtml.aspx</id><published>2009-10-22T06:45:00Z</published><updated>2009-10-22T06:45:00Z</updated><content type="html">&lt;p&gt;Для вставки в блог листинга кода я еще не встречал ничего лучше, чем аддон для Visual Studio &lt;a target="_blank" href="http://copysourceashtml.codeplex.com/"&gt;CopySourceAsHtml&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Работает он просто здорово, и все было прекрасно. Но после выхода новой беты Visual Studio 2010 возникла проблема &amp;ndash; этот аддон не работает в новой студии после установки. К счастью, есть довольно простой способ заставить его работать.&lt;/p&gt;
&lt;p&gt;Для начала, нужно скачать и установить аддон. Сделать это можно по ссылке выше, с сайта проекта на codeplex.&lt;/p&gt;
&lt;p&gt;Затем откройте директорию &amp;ldquo;Мои Документы&amp;rdquo; (My Documents в англоязычной OS). Там должны быть директории Visual Studio 2008 и Visual Studio 2010. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://winfs.ru/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gollum/image_5F00_2EE58A76.png"&gt;&lt;img height="448" width="509" src="http://blogs.gotdotnet.ru/personal/gollum/content/binary/WindowsLiveWriter/VisualStudio2010Beta2CopySourceAsHtml_10711/image_thumb.png" alt="image" border="0" title="image" style="display:inline;border-width:0px;border:0;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Внутри Visual Studio 2010 нужно создать поддиректорию Addins (если ее еще нет), и скопировать туда файл CopySourceAsHtml.AddIn из аналогичной поддиректории Visual Studio 2008.&lt;/p&gt;
&lt;p&gt;Затем, откройте его в Visual Studio. Вы увидите следующий xml-код&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;xml&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;encoding&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;standalone&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;no&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;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Extensibility&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;http://schemas.microsoft.com/AutomationExtensibility&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;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;HostApplication&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;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Microsoft Visual Studio Macros&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Name&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;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Version&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-size:large;"&gt;9.0&lt;/span&gt;&lt;/strong&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Version&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;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;HostApplication&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;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;HostApplication&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;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Microsoft Visual Studio&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Name&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;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Version&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:large;"&gt;&lt;strong&gt;9.0&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Version&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;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;HostApplication&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;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Addin&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;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;FriendlyName&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;CopySourceAsHtml&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;FriendlyName&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;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Description&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Adds support to Microsoft Visual Studio 2008 for copying source code, syntax highlighting, and line numbers as HTML.&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Description&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;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Assembly&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;JTLeigh.Tools.Development.CopySourceAsHtml, Version=3.0.3215.1, Culture=neutral, PublicKeyToken=bb2a58bdc03d2e14, processorArchitecture=MSIL&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Assembly&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;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;FullClassName&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;JTLeigh.Tools.Development.CopySourceAsHtml.Connect&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;FullClassName&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;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;LoadBehavior&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;1&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;LoadBehavior&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;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;CommandPreload&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;0&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;CommandPreload&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;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;CommandLineSafe&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;0&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;CommandLineSafe&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;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Addin&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;Extensibility&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Выделенные большим жирным шрифтом 9.0 нужно заменить на &lt;span style="font-size:large;"&gt;&lt;strong&gt;10.0&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Сохраняем файл, выходим из студии, и запускаем ее заново. После этой процедуры при выделении куска кода и щелчка правой кнопкой мыши, в контекстном меню появится пункт Copy As Html&amp;hellip;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=23758" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="Evangelism" scheme="http://winfs.ru/blogs/gollum/archive/tags/Evangelism/default.aspx" /><category term="Visual Studio 2010" scheme="http://winfs.ru/blogs/gollum/archive/tags/Visual+Studio+2010/default.aspx" /></entry><entry><title>rsdn.ru держит марку</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2009/09/04/rsdn-ru.aspx" /><id>/blogs/gollum/archive/2009/09/04/rsdn-ru.aspx</id><published>2009-09-03T22:35:00Z</published><updated>2009-09-03T22:35:00Z</updated><content type="html">&lt;p&gt;Проект &lt;a href="http://bltoolkit.net"&gt;bltoolkit&lt;/a&gt; порвал всех по &lt;a href="http://ormbattle.net/index.php/forum/6-results/48-we-have-a-new-leader.html"&gt;тестам сайта ormbattle.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; Особенно приятно про это писать, потому что отцом-основателем проекта является &lt;a href="http://www.rsdn.ru/Users/1.aspx"&gt;Игорь Ткачев&lt;/a&gt;, мегамозг и один из создателей сайта &lt;a href="http://www.rsdn.ru"&gt;rsdn.ru&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Поздравляю ребят, и желаю не останавливаться на достигнутом. На очереди провайдер для Linq :)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=22018" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term=".Net" scheme="http://winfs.ru/blogs/gollum/archive/tags/.Net/default.aspx" /><category term="Evangelism" scheme="http://winfs.ru/blogs/gollum/archive/tags/Evangelism/default.aspx" /><category term="ORM" scheme="http://winfs.ru/blogs/gollum/archive/tags/ORM/default.aspx" /></entry><entry><title>ASP.NET MVC V2 Preview 1</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2009/07/31/asp-net-mvc-v2-preview-1.aspx" /><id>/blogs/gollum/archive/2009/07/31/asp-net-mvc-v2-preview-1.aspx</id><published>2009-07-31T13:37:30Z</published><updated>2009-07-31T13:37:30Z</updated><content type="html">&lt;p&gt;Англоязычные блоги пестрят сообщениями о выходе первого превью ASP.NET MVC 2. Подробности как всегда можно посмотреть &lt;a href="http://weblogs.asp.net/scottgu/archive/2009/07/31/asp-net-mvc-v2-preview-1-released.aspx" target="_blank"&gt;в блоге Скотта Гатри (Scott Guthrie)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Я сейчас не буду переводить подробности, просто скажу, что много полезного из Dynamic Data перекочевало собственно в ASP.NET MVC Framework. Вместо этого я хотел бы задать вопрос читателям – а что бы вы хотели увидеть в следующем релизе ASP.NET MVC? Со своей стороны обещаю, что самые интересные предложения передам разработчикам MVC фреймворка.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=20096" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="ASP.NET" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET/default.aspx" /><category term=".Net" scheme="http://winfs.ru/blogs/gollum/archive/tags/.Net/default.aspx" /><category term="ASP.NET MVC Framework" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET+MVC+Framework/default.aspx" /><category term="Evangelism" scheme="http://winfs.ru/blogs/gollum/archive/tags/Evangelism/default.aspx" /></entry><entry><title>События, делегаты, собеседования</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2009/07/30/20089.aspx" /><id>/blogs/gollum/archive/2009/07/30/20089.aspx</id><published>2009-07-30T02:50:00Z</published><updated>2009-07-30T02:50:00Z</updated><content type="html">&lt;p&gt;Наткнулся на статью &lt;a href="http://habrahabr.ru/blogs/net/65697/"&gt;http://habrahabr.ru/blogs/net/65697/&lt;/a&gt; в которой приводили пример вопроса на собеседовании:&lt;/p&gt;

&lt;p style="font-size:8pt;background:white;margin:0px;color:black;font-family:verdana;"&gt;&lt;span style="font-weight:bold;color:#000096;"&gt;public&lt;/span&gt; &lt;span style="font-weight:bold;color:#000096;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;A&lt;/span&gt;&lt;/p&gt;
&lt;p style="font-size:8pt;background:white;margin:0px;color:black;font-family:verdana;"&gt;{&lt;/p&gt;
&lt;p style="font-size:8pt;background:white;margin:0px;color:black;font-family:verdana;"&gt;&amp;nbsp; &lt;span style="font-weight:bold;color:#000096;"&gt;public&lt;/span&gt; &lt;span style="font-weight:bold;color:#000096;"&gt;void&lt;/span&gt; OnDoWork()&lt;/p&gt;
&lt;p style="font-size:8pt;background:white;margin:0px;color:black;font-family:verdana;"&gt;&amp;nbsp; {&lt;/p&gt;
&lt;p style="font-size:8pt;background:white;margin:0px;color:black;font-family:verdana;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-weight:bold;color:#000096;"&gt;if&lt;/span&gt; (DoWork != &lt;span style="font-weight:bold;color:#000096;"&gt;null&lt;/span&gt;)&lt;/p&gt;
&lt;p style="font-size:8pt;background:white;margin:0px;color:black;font-family:verdana;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DoWork(&lt;span style="font-weight:bold;color:#000096;"&gt;this&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt;.Empty);&lt;/p&gt;
&lt;p style="font-size:8pt;background:white;margin:0px;color:black;font-family:verdana;"&gt;&amp;nbsp; }&lt;/p&gt;
&lt;p style="font-size:8pt;background:white;margin:0px;color:black;font-family:verdana;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="font-size:8pt;background:white;margin:0px;color:black;font-family:verdana;"&gt;&amp;nbsp; &lt;span style="font-weight:bold;color:#000096;"&gt;public&lt;/span&gt; &lt;span style="font-weight:bold;color:#000096;"&gt;event&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt; DoWork;&lt;/p&gt;
&lt;p style="font-size:8pt;background:white;margin:0px;color:black;font-family:verdana;"&gt;}&lt;/p&gt;
&lt;p style="font-size:8pt;background:white;margin:0px;color:black;font-family:verdana;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="font-size:8pt;background:white;color:black;font-family:verdana;"&gt;1. Что будет с программой, если класс A видоизменить так: убрать ключевое слово &lt;code&gt;event&lt;/code&gt;? &lt;br /&gt;2. Что будет с программой, если вообще во всем коде убрать ключевые слова &lt;code&gt;event&lt;/code&gt;?&lt;/p&gt;
&lt;div style="font-size:8pt;background:white;color:black;font-family:verdana;"&gt;&amp;hellip;&lt;/div&gt;
&lt;div style="font-size:8pt;background:white;color:black;font-family:verdana;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style="font-size:8pt;background:white;color:black;font-family:verdana;"&gt;Поэтому ответы на вопросы будут такие: &lt;/div&gt;
&lt;div style="font-size:8pt;background:white;color:black;font-family:verdana;"&gt;1. Ничего не изменится &lt;/div&gt;
&lt;div style="font-size:8pt;background:white;color:black;font-family:verdana;"&gt;2. Ничего не изменится, если только в программе нет объявленных в интерфейсах событий.&lt;/div&gt;
&lt;p&gt;На мой взгляд, сегодня подобное характерно на собеседованиях. Задающие вопросы люди САМИ не знают правильного ответа. Более того, и пример приводят абсолютно бессмысленный, с публичным обработчиком этого самого события. И даже потом пишут статьи на популярном ресурсе, декларируя такие замечательные ответы.&lt;/p&gt;
&lt;p&gt;Пусть попробуют на досуге:&lt;/p&gt;

&lt;div style="font-size:8pt;background:white;color:black;font-family:verdana;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;color:#000096;"&gt;var&lt;/span&gt; test = &lt;span style="font-weight:bold;color:#000096;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;A&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;test.DoWork = &lt;span style="font-weight:bold;color:#000096;"&gt;null&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;UPD: В &lt;span style="word-spacing:0px;font:medium &amp;#39;Times New Roman&amp;#39;;text-transform:none;color:#000000;text-indent:0px;white-space:normal;letter-spacing:normal;border-collapse:separate;orphans:2;widows:2;-webkit-border-horizontal-spacing:0px;-webkit-border-vertical-spacing:0px;-webkit-text-decorations-in-effect:none;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;" class="Apple-style-span"&gt;&lt;span style="font-size:13px;font-family:monospace;-webkit-border-horizontal-spacing:2px;-webkit-border-vertical-spacing:2px;" class="Apple-style-span"&gt;&lt;span style="word-spacing:0px;font:medium &amp;#39;Times New Roman&amp;#39;;text-transform:none;color:#000000;text-indent:0px;white-space:normal;letter-spacing:normal;border-collapse:separate;orphans:2;widows:2;-webkit-border-horizontal-spacing:0px;-webkit-border-vertical-spacing:0px;-webkit-text-decorations-in-effect:none;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;" class="Apple-style-span"&gt;&lt;span style="font-size:13px;line-height:19px;font-family:&amp;#39;Trebuchet MS&amp;#39;, &amp;#39;Lucida Grande&amp;#39;, Verdana, Lucida, Geneva, Helvetica, Arial, sans-serif;text-align:justify;-webkit-border-horizontal-spacing:2px;-webkit-border-vertical-spacing:2px;" class="Apple-style-span"&gt;комментариях нашлись-таки люди, которые привели правильный ответ. Надеюсь до этого комментария хоть кто-нибудь дочитает :)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=20089" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term=".Net" scheme="http://winfs.ru/blogs/gollum/archive/tags/.Net/default.aspx" /><category term="Evangelism" scheme="http://winfs.ru/blogs/gollum/archive/tags/Evangelism/default.aspx" /></entry><entry><title>OpenXML SDK 2.0 Create Worksheet</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2009/07/10/openxml-sdk-2-0-create-worksheet.aspx" /><id>/blogs/gollum/archive/2009/07/10/openxml-sdk-2-0-create-worksheet.aspx</id><published>2009-07-10T19:19:00Z</published><updated>2009-07-10T19:19:00Z</updated><content type="html">&lt;p&gt;В очередной раз столкнувшись с необходимостью создать отчет в excel, я вспомнил что Microsoft выпустил для нас SDK, который по идее отменяет необходимость в автоматизации офиса. Я обрадовался, скачал SDK и стал смотреть примеры кода. Первое, что меня удивило – примеров крайне мало. Ладно, подумал я. В состав пакета входит замечательная утилита под названием Document Reflector – она загружает документ и выдает код на C#! Я создал пустой .xlsx файл, открыл его в рефлекторе, взял код, запустил, сохранил сгенерированный файл и…&lt;/p&gt;  &lt;p&gt;Ошибка, эксель предлагает восстанавливать данные. Ладно, ведь это CTP. Откроем документ и сделаем в нем новый лист. И вот тут оказалось, что это не такая уж и простая задача. Вообще, если честно, DOM мне не понравился. Понятно что он и должен быть сложным, но должны же быть простые пути решения типовых задач! В общем, если кто-то тоже мучается как и я, то вот что у меня получилось для создания нового листа в книге excel (код модифицирован для демонстрационных целей :) )&lt;/p&gt;   &lt;div style="font-size:8pt;background:white;color:black;font-family:verdana;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// указываете путь к своему документу excel&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;using&lt;/span&gt; (&lt;span style="font-weight:bold;color:#000096;"&gt;var&lt;/span&gt; doc = &lt;span style="color:#2b91af;"&gt;SpreadsheetDocument&lt;/span&gt;.Open(&lt;span style="color:#a31515;"&gt;&amp;quot;test.xlsx&amp;quot;&lt;/span&gt;, &lt;span style="font-weight:bold;color:#000096;"&gt;true&lt;/span&gt;))&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;var&lt;/span&gt; newWorksheetPart = doc.AddNewWorksheet(&lt;span style="color:blue;"&gt;&amp;quot;Новый лист&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;var&lt;/span&gt; sheetData = newWorksheetPart.Worksheet.GetFirstChild&amp;lt;&lt;span style="color:#2b91af;"&gt;SheetData&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;var&lt;/span&gt; row = &lt;span style="font-weight:bold;color:#000096;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Row&lt;/span&gt; { RowIndex = 1 };&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; row.AddTextCell(&lt;span style="color:blue;"&gt;&amp;quot;A&amp;quot;&lt;/span&gt;, row.RowIndex, &lt;span style="color:blue;"&gt;&amp;quot;Привет&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; row.AddTextCell(&lt;span style="color:blue;"&gt;&amp;quot;B&amp;quot;&lt;/span&gt;, row.RowIndex, &lt;span style="color:blue;"&gt;&amp;quot;Мир&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sheetData.AppendChild(row);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; newWorksheetPart.Worksheet.Save();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; doc.WorkbookPart.Workbook.Save();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;А это – обертка&lt;/p&gt;   &lt;div style="font-size:8pt;background:white;color:black;font-family:verdana;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;public&lt;/span&gt; &lt;span style="font-weight:bold;color:#000096;"&gt;static&lt;/span&gt; &lt;span style="font-weight:bold;color:#000096;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SpreadsheetDocumentExtensions&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;public&lt;/span&gt; &lt;span style="font-weight:bold;color:#000096;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;WorksheetPart&lt;/span&gt; AddNewWorksheet(&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SpreadsheetDocument&lt;/span&gt; doc, &lt;span style="font-weight:bold;color:#000096;"&gt;string&lt;/span&gt; name)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;if&lt;/span&gt;(&lt;span style="font-weight:bold;color:#000096;"&gt;null&lt;/span&gt; == doc) &lt;span style="font-weight:bold;color:#000096;"&gt;return&lt;/span&gt; &lt;span style="font-weight:bold;color:#000096;"&gt;null&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 15&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;var&lt;/span&gt; newWp = doc.WorkbookPart.AddNewPart&amp;lt;&lt;span style="color:#2b91af;"&gt;WorksheetPart&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 16&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;var&lt;/span&gt; newWs = &lt;span style="font-weight:bold;color:#000096;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Worksheet&lt;/span&gt;(&lt;span style="font-weight:bold;color:#000096;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SheetData&lt;/span&gt;());&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 17&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; newWs.Save(newWp);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;var&lt;/span&gt; newWpId = doc.WorkbookPart.GetIdOfPart(newWp);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 20&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;var&lt;/span&gt; sheets = doc.WorkbookPart.Workbook.GetFirstChild&amp;lt;&lt;span style="color:#2b91af;"&gt;Sheets&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 21&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 22&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;uint&lt;/span&gt; sheetId = 1;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 23&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;if&lt;/span&gt; (sheets.Elements&amp;lt;&lt;span style="color:#2b91af;"&gt;Sheet&lt;/span&gt;&amp;gt;().Count() &amp;gt; 0) &lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 24&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 25&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sheetId = sheets.Elements&amp;lt;&lt;span style="color:#2b91af;"&gt;Sheet&lt;/span&gt;&amp;gt;().Select(s =&amp;gt; s.SheetId.Value).Max() + 1;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 26&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 27&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 28&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;var&lt;/span&gt; sheet = &lt;span style="font-weight:bold;color:#000096;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Sheet&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 29&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 30&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Id = newWpId,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 31&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SheetId = sheetId, Name = name&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 32&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 33&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 34&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sheets.Append(sheet);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 35&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;return&lt;/span&gt; newWp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 36&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 37&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 38&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 39&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;public&lt;/span&gt; &lt;span style="font-weight:bold;color:#000096;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Cell&lt;/span&gt; AddTextCell(&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 40&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Row&lt;/span&gt; row, &lt;span style="font-weight:bold;color:#000096;"&gt;string&lt;/span&gt; column, &lt;span style="font-weight:bold;color:#000096;"&gt;uint&lt;/span&gt; index, &lt;span style="font-weight:bold;color:#000096;"&gt;string&lt;/span&gt; text)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 41&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 42&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;if&lt;/span&gt;(&lt;span style="font-weight:bold;color:#000096;"&gt;null&lt;/span&gt; == row) &lt;span style="font-weight:bold;color:#000096;"&gt;return&lt;/span&gt; &lt;span style="font-weight:bold;color:#000096;"&gt;null&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 43&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 44&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;var&lt;/span&gt; cell = &lt;span style="font-weight:bold;color:#000096;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Cell&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 45&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 46&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DataType = &lt;span style="color:#2b91af;"&gt;CellValues&lt;/span&gt;.InlineString,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 47&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CellReference = column + index&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 48&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 49&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 50&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cell.AppendChild(&lt;span style="font-weight:bold;color:#000096;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;InlineString&lt;/span&gt;(&lt;span style="font-weight:bold;color:#000096;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Text&lt;/span&gt; { Text = text }));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 51&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; row.AppendChild(cell);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 52&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;color:#000096;"&gt;return&lt;/span&gt; cell;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 53&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:teal;"&gt;&amp;#160;&amp;#160; 54&lt;/span&gt;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=20077" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term=".Net" scheme="http://winfs.ru/blogs/gollum/archive/tags/.Net/default.aspx" /><category term="OpenXML SDK" scheme="http://winfs.ru/blogs/gollum/archive/tags/OpenXML+SDK/default.aspx" /></entry><entry><title>ASP.NET MVC 1.0 Release</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2009/03/18/asp-net-mvc-framework-release.aspx" /><id>/blogs/gollum/archive/2009/03/18/asp-net-mvc-framework-release.aspx</id><published>2009-03-18T07:00:00Z</published><updated>2009-03-18T07:00:00Z</updated><content type="html">&lt;p&gt;На сайте Microsoft был замечен &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&amp;amp;displaylang=en"&gt;релиз ASP.NET MVC 1.0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Не смотря на то, что никто про это еще не написал, это именно релиз :) Может быть его кто-то разместил слишком рано, и может быть его уберут, но я уже скачал :)&lt;br /&gt;&lt;br /&gt;Пользуйтесь.&lt;br /&gt;&lt;br /&gt;Из интересных вещей - декларативные &amp;quot;контролы&amp;quot; которые сделали в RC2 (он был приватный и нам нельзя было рассказывать про это по NDA, но недавно в публичном блоге про это написал кто-то из MS)&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&amp;amp;displaylang=en"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=20067" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="ASP.NET MVC Framework" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET+MVC+Framework/default.aspx" /></entry><entry><title>Локализация продуктов для разработчиков</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2008/10/28/20038.aspx" /><id>/blogs/gollum/archive/2008/10/28/20038.aspx</id><published>2008-10-28T16:55:00Z</published><updated>2008-10-28T16:55:00Z</updated><content type="html">&lt;p&gt;Недавно здесь уже была дискуссия по поводу локализации продуктов для разработчиков. Мол, это очень плохо, качество ужасно, ошибки по-русски в гугле не найдешь. Вместо того, чтобы работать над улучшением локализации, чтобы ей все пользовались, предлагалось вообще от локализации отказаться. Зачем разработчикам русифицированный продукт?&amp;nbsp; Причем предлагалось не просто ничего не делать - а объявить локализацию злом и вредным явлением. Еще один аргумент, запомнившийся мне особенно, гласил что разработчики, если будут без проблем читать документацию по-русски, разленятся и не будут учить английский и искать информацию в первоисточнике.&lt;br /&gt;&lt;br /&gt;Похожая дискуссия была, как сейчас помню, во время моего обучения на химическом факультете МГУ. Речь шла о справочнике Бельштейна по органическим соединениям, который был издан на немецком языке. Почему бы кроме органической химии еще не подучить немецкий - когда еще будет столь прекрасная возможность?&lt;br /&gt;&lt;br /&gt;Однако, не все люди придерживаются такой точки зрения. И благодаря этому, благодаря труду переводчиков, российских MVP (я тоже принял посильное, пусть и небольшое участие), и всей команды по локализации, мы дождались, я бы сказал, знакового события. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/sandcastle/archive/2008/10/28/russian-release-of-visual-studio-2008-netfx-3-5-and-the-vs-2008-msdn-library.aspx"&gt;&lt;b&gt;&lt;font size="4"&gt;Выпуск Visual Studio 2008, .NET Framework 3.5 и MSDN Library на русском языке.&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Да, пока недостатоков просто куча. Но, я уверен, что процесс уже не остановить, и в конце концов мы придем к качественной российской локализации продуктов для разработчиков и большой базы знаний на русском языке. Отсутствие чего сейчас объявляют главной причиной того, что локализация не нужна совсем.&lt;br /&gt;&lt;br /&gt;&lt;img border="0" alt="" src="http://blogs.msdn.com/photos/aram/images/9019739/original.aspx" width="569" height="234" /&gt; &lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=20038" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="Visual Studio" scheme="http://winfs.ru/blogs/gollum/archive/tags/Visual+Studio/default.aspx" /><category term="Evangelism" scheme="http://winfs.ru/blogs/gollum/archive/tags/Evangelism/default.aspx" /></entry><entry><title>ASP.NET MVC Framework Beta</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2008/10/17/asp-net-mvc-framework-beta.aspx" /><id>/blogs/gollum/archive/2008/10/17/asp-net-mvc-framework-beta.aspx</id><published>2008-10-17T09:59:00Z</published><updated>2008-10-17T09:59:00Z</updated><content type="html">Итак, как вы все уже знаете, вышла бета MVC Framework&amp;#39;а.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2008/10/16/asp-net-mvc-beta-released.aspx"&gt;Подробности&lt;/a&gt; в блоге неподражаемого &amp;#39;The Gu&amp;#39; - Scott Guthrie :)&lt;br /&gt;&lt;br /&gt;Из упомянутых изменений, на мой взгляд, в первую очередь нужно обратить внимание на поддержку сценария Silverlight front-end + ASP.NET MVC backend. &lt;br /&gt;&lt;br /&gt;Так же интересно про Model Binders - концепция, про которую рассказывали в Preview 5 приобрела реализацию. Можно уже щупать и ворчать, что &amp;quot;они опять все сделали не так&amp;quot; :)&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=20037" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="Silverlight" scheme="http://winfs.ru/blogs/gollum/archive/tags/Silverlight/default.aspx" /><category term="ASP.NET MVC Framework" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET+MVC+Framework/default.aspx" /></entry><entry><title>Расширение функциональности ASP.NET MVC Framework. Webcast</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2008/06/30/asp-net-mvc-framework-webcast.aspx" /><id>/blogs/gollum/archive/2008/06/30/asp-net-mvc-framework-webcast.aspx</id><published>2008-06-30T15:07:00Z</published><updated>2008-06-30T15:07:00Z</updated><content type="html">&lt;font size="2"&gt;3-го июля будет проведен еще один веб-каст, посвященный
возможностям расширения функциональности ASP.NET MVC Framework. Может
быть будет кусок про AJAX - посмотрим, успею ли подготовить.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.microsoft.com/rus/events/detail.mspx?eventid=1032382439" class="m" target="_blank"&gt;http://www.microsoft.com/rus/events/detail.mspx?eventid=1032382439&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Если хотите услышать что-то конкретное — пишите в комментарии, рассмотрим :)&lt;/font&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=16752" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="ASP.NET" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET/default.aspx" /><category term="ASP.NET Ajax" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET+Ajax/default.aspx" /><category term="ASP.NET MVC Framework" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET+MVC+Framework/default.aspx" /><category term="Evangelism" scheme="http://winfs.ru/blogs/gollum/archive/tags/Evangelism/default.aspx" /></entry><entry><title>ASP.NET MVC Framework Tips And Tricks Webcast</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2008/06/05/asp-net-mvc-framework-tips-and-tricks-webcast.aspx" /><id>/blogs/gollum/archive/2008/06/05/asp-net-mvc-framework-tips-and-tricks-webcast.aspx</id><published>2008-06-04T22:56:00Z</published><updated>2008-06-04T22:56:00Z</updated><content type="html">&lt;p&gt;Итак, вебкаст состоится сегодня, 5-го июня в 17:00 по московскому времени. Это мой первый опыт, так что думаю какие-то накладки обязательно произойдут :)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.microsoft.com/rus/events/detail.mspx?eventid=1032380596"&gt;http://www.microsoft.com/rus/events/detail.mspx?eventid=1032380596&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=15879" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="ASP.NET" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET/default.aspx" /><category term="ASP.NET MVC Framework" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET+MVC+Framework/default.aspx" /></entry><entry><title>ASP.NET MVC preview 3 webcast</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2008/05/28/asp-net-mvc-preview-3-webcast.aspx" /><id>/blogs/gollum/archive/2008/05/28/asp-net-mvc-preview-3-webcast.aspx</id><published>2008-05-28T12:22:00Z</published><updated>2008-05-28T12:22:00Z</updated><content type="html">&lt;p&gt;Вот&amp;nbsp;и вышла следующая ознакомительная версия ASP.NET MVC Framework. Подробно по этому поводу можно почитать в блогах &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/05/27/asp-net-mvc-preview-3-release.aspx"&gt;Scott Guthrie&lt;/a&gt; и &lt;a href="http://www.hanselman.com/blog/ASPNETMVCPreview3.aspx"&gt;Scott Hanselman&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;На сайте &lt;a href="http://asp.net/mvc"&gt;http://asp.net/mvc&lt;/a&gt;&amp;nbsp;уже доступны обновления. Сразу скажу что из бросающихся в глаза изменений есть только возможность в действиях возвращать объект типа ActionResult, что удобно для unit тестирования. Но речь пойдет немного не об этом.&lt;/p&gt;
&lt;p&gt;Дело в том, что в ближайшем будущем я планирую провести веб-каст про ASP.NET MVC Framework. О точной дате и времени сообщу дополнительно. Так как источники информации в общем-то у всех нас одни и те же, то не хотелось бы рассказывать о том, что все уже и так знают. Поэтому, я бы хотел попросить вас&amp;nbsp;в комментариях&amp;nbsp;рассказать, о чем бы вам было интересно услышать в этом веб-касте, и то, о чем рассказывать не стоит. И еще, в какой день недели и в какое время вам было бы удобно его смотреть (пока есть временные рамки от 12 до 18 часов)&lt;/p&gt;
&lt;p&gt;По результатам я попытаюсь сделать так, чтобы всем было интересно и удобно.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=15514" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="ASP.NET" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET/default.aspx" /><category term="ASP.NET MVC Framework" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET+MVC+Framework/default.aspx" /></entry><entry><title>Герои среди нас :)</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2008/03/17/13620.aspx" /><id>/blogs/gollum/archive/2008/03/17/13620.aspx</id><published>2008-03-17T11:24:00Z</published><updated>2008-03-17T11:24:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;Во вторник, 18-го марта, в Москве состоится &lt;a href="http://heroes2008.ru" target="_blank"&gt;мероприятие, посвященное запуску продуктов Microsoft Windows Server 2008, Visual Studio 2008 и SQL Server 2008&lt;/a&gt;. Я там буду присутствовать в качестве эксперта. Приходите, буду рад ответить на ваши вопросы! &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=13620" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="Visual Studio" scheme="http://winfs.ru/blogs/gollum/archive/tags/Visual+Studio/default.aspx" /><category term="Evangelism" scheme="http://winfs.ru/blogs/gollum/archive/tags/Evangelism/default.aspx" /></entry><entry><title>ASP.NET 3.5 Extensions CTP</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2007/12/10/asp-net-3-5-extensions-ctp.aspx" /><id>/blogs/gollum/archive/2007/12/10/asp-net-3-5-extensions-ctp.aspx</id><published>2007-12-10T09:20:42Z</published><updated>2007-12-10T09:20:42Z</updated><content type="html">&lt;p&gt;Итак, Scott Guthrie анонсировал &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/12/09/asp-net-3-5-extensions-ctp-preview-released.aspx" target="_blank"&gt;первый релиз расширений ASP.NET&lt;/a&gt;, в котором есть то, что так многие стремились попробовать своими руками. Это ASP.NET MVC. &lt;/p&gt; &lt;p&gt;Для тех, кто предпочитает читать на русском языке, вкратце перечислю то, что вошло в данный пакет:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;ASP.NET Ajax Improvements - исправления и дополнения к AJAX - фреймворку, улучшенная поддержка history в веб-браузере, ссылки на контент и улучшения в клиентских библиотеках  &lt;li&gt;ASP.NET MVC - собственно, MVC фреймворк  &lt;li&gt;ASP.NET Dynamic Data Support - облегчает создание веб-страниц, отображающих и работающих с данными из БД  &lt;li&gt;ASP.NET Silverlight Support - поддержка Silverlight, в частности элемент управления, который проигрывает видео  &lt;li&gt;ADO.NET Data Services - собственно Entity Framework для ADO.NET&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Для меня здесь, конечно же, интереснее всего именно MVC. Попытаюсь как можно скорее посмотреть, что же он из себя представляет и какие возможности у него есть на самом деле. По результатам обязательно напишу.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=12246" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="ASP.NET" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET/default.aspx" /><category term="ASP.NET MVC Framework" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET+MVC+Framework/default.aspx" /></entry><entry><title>Платформа 2008</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2007/11/26/12197.aspx" /><id>/blogs/gollum/archive/2007/11/26/12197.aspx</id><published>2007-11-26T12:05:58Z</published><updated>2007-11-26T12:05:58Z</updated><content type="html">&lt;p&gt;Я иду на платформу 2008. Буду присутствовать там в зоне Ask the Expert на стенде средства разработки. Если хотите задать вопрос - это будет самое правильное время )&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;a href="https://platforma2008.ru/ViewPersonal.aspx?UserId=2322b83f-a895-44ba-8ddc-7075d3c0145c"&gt;&lt;img alt="Платформа 2008" src="http://platforma2008.ru/UserBanner.aspx?UserId=2322b83f-a895-44ba-8ddc-7075d3c0145c&amp;amp;size=468x60" border="0" /&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=12197" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="Life" scheme="http://winfs.ru/blogs/gollum/archive/tags/Life/default.aspx" /><category term="ASP.NET" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET/default.aspx" /><category term="Fun" scheme="http://winfs.ru/blogs/gollum/archive/tags/Fun/default.aspx" /><category term="ASP.NET Ajax" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET+Ajax/default.aspx" /><category term="Silverlight" scheme="http://winfs.ru/blogs/gollum/archive/tags/Silverlight/default.aspx" /></entry><entry><title>Архитектура веб-приложений</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2007/10/29/11909.aspx" /><id>/blogs/gollum/archive/2007/10/29/11909.aspx</id><published>2007-10-29T11:38:00Z</published><updated>2007-10-29T11:38:00Z</updated><content type="html">&lt;p&gt;Продолжаем разговор :) Вот еще один опрос, на этот раз на архитектурные темы.&lt;/p&gt; &lt;p&gt;Хотелось бы узнать, какие архитектурные приемы вы используете для разработки веб-приложений на платформе ASP.NET и ASP.NET AJAX. Меня интересует следующее:&lt;/p&gt; &lt;p&gt;1) Паттерн MVC/MVP, фреймворки сторонних производителей типа MonoRail, Spring.NET, различные IoC контейнеры. Используете ли ASP.NET AJAX совместно с данной моделью.&lt;/p&gt; &lt;p&gt;2) Пользуетесь ли стандартной моделью ASP.NET + AJAX&lt;/p&gt; &lt;p&gt;3) Задумывались ли когда-нибудь сделать что-то типа клиентского веб-приложения, на DHTML и Javascript, которое вызывает серверные методы через AJAX и веб-сервисы, например.&lt;/p&gt; &lt;p&gt;4) Аггрегация vs наследование :) Модная нынче тема для обсуждений. Используете ли вы наследование в качестве инструмента повторного использования кода? Считаете ли это вредным, и используете только аггрегацию? Если используете и то и то, то какими критериями руководствуетесь при выборе?&lt;/p&gt; &lt;p&gt;5) Рассматриваете ли возможность заменить клиентскую часть на Silverlight?&lt;/p&gt; &lt;p&gt;6) Может быть используете какие-то совсем другие подходы?&lt;/p&gt; &lt;p&gt;Эти пункты не являются альтернативными, т.е. меня интересуют комментарии на все вышеперечисленные темы. Спасибо!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=11909" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="Programming" scheme="http://winfs.ru/blogs/gollum/archive/tags/Programming/default.aspx" /><category term="ASP.NET" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET/default.aspx" /><category term="ASP.NET Ajax" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET+Ajax/default.aspx" /><category term="Silverlight" scheme="http://winfs.ru/blogs/gollum/archive/tags/Silverlight/default.aspx" /></entry><entry><title>LiveMeeting, Screencast, Podcast</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2007/10/25/livemeeting-screencast-podcast.aspx" /><id>/blogs/gollum/archive/2007/10/25/livemeeting-screencast-podcast.aspx</id><published>2007-10-25T15:01:00Z</published><updated>2007-10-25T15:01:00Z</updated><content type="html">&lt;p&gt;Всем привет! Хотел бы узнать ваше мнение по поводу следующих вопросов:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Заинтересовала бы вас возможность провести виртуальную встречу на тему какой-либо современной технологии? Скажем&amp;nbsp;в формате LiveMeeting&amp;nbsp;по Ajax ASP.NET или Silverlight, или по вопросам архитектуры веб-приложений?&lt;/li&gt; &lt;li&gt;Интересуют ли вас видеоролики в формате screencast? На какие темы?&lt;/li&gt; &lt;li&gt;Интересуют ли вас аудиозаписи в виде podcast? На какие темы?&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Прошу высказываться в комментариях.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=11895" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="Programming" scheme="http://winfs.ru/blogs/gollum/archive/tags/Programming/default.aspx" /><category term="ASP.NET" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET/default.aspx" /><category term="ASP.NET Ajax" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET+Ajax/default.aspx" /><category term=".Net" scheme="http://winfs.ru/blogs/gollum/archive/tags/.Net/default.aspx" /><category term="Silverlight" scheme="http://winfs.ru/blogs/gollum/archive/tags/Silverlight/default.aspx" /></entry><entry><title>Россия-Англия 2:1</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2007/10/17/2-1.aspx" /><id>/blogs/gollum/archive/2007/10/17/2-1.aspx</id><published>2007-10-17T19:43:34Z</published><updated>2007-10-17T19:43:34Z</updated><content type="html">&lt;p&gt;Я счастлив :)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=11871" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="Life" scheme="http://winfs.ru/blogs/gollum/archive/tags/Life/default.aspx" /><category term="Футбол" scheme="http://winfs.ru/blogs/gollum/archive/tags/_24044304420431043E043B04_/default.aspx" /></entry><entry><title>Удивительное рядом</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2007/09/01/11530.aspx" /><id>/blogs/gollum/archive/2007/09/01/11530.aspx</id><published>2007-09-01T09:07:00Z</published><updated>2007-09-01T09:07:00Z</updated><content type="html">&lt;p&gt;А вы знали, что можно сделать так:&lt;/p&gt;
&lt;div&gt;Control c; &lt;br /&gt;c = ParseControl(&amp;quot;&lt;span style="COLOR:#8b0000;"&gt;Enter your name: &amp;lt;asp:TextBox id=&amp;#39;FirstName&amp;#39; runat=&amp;#39;server&amp;#39;/&amp;gt;&lt;/span&gt;&amp;quot;); &lt;/div&gt;
&lt;p&gt;Только честно :)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=11530" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="Programming" scheme="http://winfs.ru/blogs/gollum/archive/tags/Programming/default.aspx" /><category term="ASP.NET" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET/default.aspx" /><category term="ASP.NET Ajax" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET+Ajax/default.aspx" /></entry><entry><title>Кто вы в South Park?</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2007/08/31/south-park.aspx" /><id>/blogs/gollum/archive/2007/08/31/south-park.aspx</id><published>2007-08-31T15:08:00Z</published><updated>2007-08-31T15:08:00Z</updated><content type="html">
&lt;p&gt;Отличный тест, кем бы вы были в известном мультике South Park :)&lt;/p&gt;
 
&lt;p&gt;&lt;a href="http://www.allsouthpark.ru/index.php?option=com_content&amp;amp;task=view&amp;amp;id=65&amp;amp;Itemid=64"&gt;http://www.allsouthpark.ru/index.php?option=com_content&amp;amp;task=view&amp;amp;id=65&amp;amp;Itemid=64&lt;/a&gt;&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="8"&gt;&lt;tr align="center"&gt;&lt;td&gt;&lt;img src="http://www.allsouthpark.ru/test/stan.jpg" alt="" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;font face="Arial" size="large"&gt;&lt;b&gt;Вы - Стен!&lt;/b&gt;&lt;/font&gt;&lt;p align="justify"&gt;&lt;font face="Trebuchet MS" size="2"&gt;Вы - Стен Марш, вероятно, самый нормальный из всех. Вы легко решаете проблемы и строите разумные планы. Вы любите - и это удивительно! Возможно, вы актвивист и, без сомнения, достаточно умны. &lt;/font&gt;&lt;/p&gt;&lt;table cellpadding="0" cellspacing="3"&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;p&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;b&gt;Картман&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;table bgcolor="#ff7735" cellpadding="0" cellspacing="1"&gt;&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;font face="Trebuschet MS" size="1"&gt;85 %&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;table cellpadding="0" cellspacing="3"&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;p&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;b&gt;Джимми&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;table bgcolor="#ff7735" cellpadding="0" cellspacing="1"&gt;&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;font face="Trebuschet MS" size="1"&gt;45 %&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;table cellpadding="0" cellspacing="3"&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;p&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;b&gt;Тимми!&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;table bgcolor="#ff7735" cellpadding="0" cellspacing="1"&gt;&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;font face="Trebuschet MS" size="1"&gt;45 %&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;table cellpadding="0" cellspacing="3"&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;p&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;b&gt;Твик&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;table bgcolor="#ff7735" cellpadding="0" cellspacing="1"&gt;&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;font face="Trebuschet MS" size="1"&gt;35 %&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;table cellpadding="0" cellspacing="3"&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;p&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;b&gt;Баттерс&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;table bgcolor="#ff7735" cellpadding="0" cellspacing="1"&gt;&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;font face="Trebuschet MS" size="1"&gt;35 %&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;table cellpadding="0" cellspacing="3"&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;p&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;b&gt;Кенни&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;table bgcolor="#ff7735" cellpadding="0" cellspacing="1"&gt;&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;font face="Trebuschet MS" size="1"&gt;28 %&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;table cellpadding="0" cellspacing="3"&gt;&lt;tr&gt;&lt;td align="right"&gt;&lt;p&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;b&gt;Кайл&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;table bgcolor="#ff7735" cellpadding="0" cellspacing="1"&gt;&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;font face="Trebuschet MS" size="1"&gt;15 %&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p align="center"&gt;&lt;a href="http://www.allsouthpark.ru/index.php?option=com_content&amp;amp;task=view&amp;amp;id=65&amp;amp;Itemid=64"&gt;&lt;font face="Trebuchet MS"&gt;Кто вы из мультфильма South Park?&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.allsouthpark.ru/"&gt;&lt;font face="Trebuchet MS" size="1"&gt;&lt;b&gt;All South Park&lt;/b&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=11528" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="Life" scheme="http://winfs.ru/blogs/gollum/archive/tags/Life/default.aspx" /><category term="Fun" scheme="http://winfs.ru/blogs/gollum/archive/tags/Fun/default.aspx" /></entry><entry><title>LINQPad и обработка исключений в ASP.NET AJAX</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2007/08/30/linqpad-asp-net-ajax.aspx" /><id>/blogs/gollum/archive/2007/08/30/linqpad-asp-net-ajax.aspx</id><published>2007-08-30T08:25:39Z</published><updated>2007-08-30T08:25:39Z</updated><content type="html">&lt;p&gt;Привет!&lt;/p&gt; &lt;p&gt;Сегодня &lt;a href="http://msdn2.microsoft.com/en-us/library/bb266332.aspx" target="_blank"&gt;Scott Guthrie&lt;/a&gt;&amp;nbsp;выложил в &lt;a href="http://weblogs.asp.net/scottgu/" target="_blank"&gt;своем блоге&lt;/a&gt;&amp;nbsp;очередной &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/08/30/august-30th-links-asp-net-asp-net-ajax-iis7-visual-studio-silverlight-net.aspx" target="_blank"&gt;обзор&lt;/a&gt; интересных статей по&amp;nbsp;ASP.NET, LINQ, IIS 7.0&amp;nbsp;и Silverlight&lt;/p&gt; &lt;p&gt;Хочу отметить чрезвычайно удобный инструмент для разработчиков, использующих LINQ.&amp;nbsp;Это - &lt;a href="http://www.albahari.com/linqpad.html" target="_blank"&gt;LINQPad&lt;/a&gt;.&amp;nbsp;Подробности можно узнать, перейдя по ссылке, а &amp;nbsp;вкратце - это инструмент, напоминяющий query analyzer, но работающий для запросов LINQ. Очень удобно - можно получать результаты в удобной визуальной форме, и видеть, какой именно запрос SQL получается из данного запроса LINQ. &lt;/p&gt; &lt;p&gt;Еще хочу отметить &lt;a href="http://dotnetslackers.com/columns/ajax/AspNetAjaxExceptionLogging.aspx" target="_blank"&gt;статью об обработке исключений в ASP.NET AJAX&lt;/a&gt;. Дело в том, что при использовании AJAX очень многие исключения перехватываются, и отправляются клиенту. Изложенная в статье информация поможет понять, как же все-таки сохранять информацию об исключениях на стороне сервера. Тем не менее, я, в отличие от автора статьи, не восхищаюсь архитектурой Enterprise Library, и обработку исключений предпочитаю делать на основе веб-событий. И архитектура приведенного решения с синглтоном мне тоже не очень по душе.&lt;/p&gt; &lt;p&gt;И, в качестве десерта, &lt;a href="http://mattberseth.com/blog/2007/08/the_everuseful_get_and_find_as.html" target="_blank"&gt;информация о клиентских функциях ASP.NET AJAX $get и $find&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=11516" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term="Programming" scheme="http://winfs.ru/blogs/gollum/archive/tags/Programming/default.aspx" /><category term="Visual Studio" scheme="http://winfs.ru/blogs/gollum/archive/tags/Visual+Studio/default.aspx" /><category term="ASP.NET" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET/default.aspx" /><category term="ASP.NET Ajax" scheme="http://winfs.ru/blogs/gollum/archive/tags/ASP.NET+Ajax/default.aspx" /><category term=".Net" scheme="http://winfs.ru/blogs/gollum/archive/tags/.Net/default.aspx" /><category term="C# 3.0" scheme="http://winfs.ru/blogs/gollum/archive/tags/C_2300_+3.0/default.aspx" /></entry><entry><title>Код дня</title><link rel="alternate" type="text/html" href="/blogs/gollum/archive/2007/08/20/11469.aspx" /><id>/blogs/gollum/archive/2007/08/20/11469.aspx</id><published>2007-08-20T12:18:00Z</published><updated>2007-08-20T12:18:00Z</updated><content type="html">&lt;p&gt;Бывает так, что в процессе работы встречаешь код, который не оставляет тебя равнодушным. Я подумал, что может быть такое может быть интересно читателям блога. Открываю рубрику &amp;quot;код дня&amp;quot;, и первым номером, пожалуй пойдет такая конструкция:&lt;/p&gt;&lt;div&gt;&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-family:Consolas,&amp;#39;Courier New&amp;#39;,Courier,Monospace;font-size:8pt;line-height:12pt;color:black;width:100%;"&gt;&lt;span&gt;var&lt;/span&gt; distinctUsers = userList.GroupBy(u =&amp;gt; u.Login).Select(&lt;br /&gt;    g =&amp;gt; &lt;span&gt;new&lt;/span&gt; ActiveDirectoryUser{&lt;br /&gt;             Login = g.Key,&lt;br /&gt;             Email = g.First().Email,&lt;br /&gt;             Name = g.First().Name&lt;br /&gt;         });&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;К сожалению, в текущей реализации C# 3.0 не совсем правильно работает метод Distinct (поэтому он здесь и не применен), но при работе с локальными коллекциями это не проблема, как и показывает вышеприведенный код.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://winfs.ru/aggbug.aspx?PostID=11469" width="1" height="1"&gt;</content><author><name>Gollum</name><uri>http://winfs.ru/members/Gollum/default.aspx</uri></author><category term=".Net" scheme="http://winfs.ru/blogs/gollum/archive/tags/.Net/default.aspx" /><category term="Code of the day" scheme="http://winfs.ru/blogs/gollum/archive/tags/Code+of+the+day/default.aspx" /><category term="C# 3.0" scheme="http://winfs.ru/blogs/gollum/archive/tags/C_2300_+3.0/default.aspx" /></entry></feed>