<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>It Could Be Done!</title><link>https://weblogs.asp.net:443/ysolodkyy/</link><description>the blog about ASP.NET and not only</description><item><title>Master Page and PreInit</title><link>https://weblogs.asp.net:443/ysolodkyy/master-page-and-preinit</link><description>&lt;P&gt;&lt;A href="http://weblogs.asp.net/emilstoichev/archive/2007/10/08/thoughts-on-the-asp-net-viewstate.aspx" target=_blank mce_href="http://weblogs.asp.net/emilstoichev/archive/2007/10/08/thoughts-on-the-asp-net-viewstate.aspx"&gt;Emil Stoichev&lt;/A&gt; reminded today that it is very important to understand what is &lt;A href="http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx" target=_blank mce_href="http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx"&gt;ViewState&lt;/A&gt;, &lt;A href="http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx" target=_blank mce_href="http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx"&gt;how it works and how we should use it&lt;/A&gt;.&amp;nbsp; The other problem mentioned &lt;A href="http://weblogs.asp.net/emilstoichev/archive/2007/10/08/thoughts-on-the-asp-net-viewstate.aspx" target=_blank mce_href="http://weblogs.asp.net/emilstoichev/archive/2007/10/08/thoughts-on-the-asp-net-viewstate.aspx"&gt;there&lt;/A&gt; is unavailability of controls in PreInit phase if MasterPage is used.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The problem is very simple.&amp;nbsp; If you have the following content page (in master page), &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; BACKGROUND: yellow; FONT-FAMILY: consolas; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-highlight: yellow; mso-ansi-language: uk; mso-fareast-language: uk; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt;&amp;lt;%&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: consolas; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: uk; mso-fareast-language: uk; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt;@&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: uk; mso-fareast-language: uk; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt; &lt;SPAN style="COLOR: #a31515"&gt;Page&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Language&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="C#"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;MasterPageFile&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="~/MasterPage.master"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Title&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Page"&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND: yellow; mso-highlight: yellow"&gt;%&amp;gt; &lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Content&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Content1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ContentPlaceHolderID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="ContentPlaceHolder1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Server"&amp;gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;Content&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Label&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="ContentPageLabel"&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;/&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt; &lt;BR&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Content&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt; &lt;BR&gt;&lt;BR&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;script&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&amp;gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;override&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; OnPreInit(&lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e) &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{ &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;base&lt;/SPAN&gt;.OnPreInit(e); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // next line crashes &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;ContentPageLabel.Text = &lt;SPAN style="COLOR: #a31515"&gt;"Hello, World!"&lt;/SPAN&gt;; &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;} &lt;BR&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;script&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt; &lt;/P&gt;
&lt;P&gt;it crashes on the label text assignment with:&lt;/P&gt;&lt;SPAN&gt;
&lt;H2&gt;&lt;EM&gt;Object reference not set to an instance of an object. &lt;/EM&gt;&lt;/H2&gt;&lt;/SPAN&gt;&lt;FONT face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif "&gt;&lt;EM&gt;&lt;B&gt;Description: &lt;/B&gt;An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. &lt;BR&gt;&lt;BR&gt;&lt;B&gt;Exception Details: &lt;/B&gt;System.NullReferenceException: Object reference not set to an instance of an object. &lt;BR&gt;&lt;BR&gt;&lt;B&gt;Source Error:&lt;/B&gt; &lt;BR&gt;&lt;BR&gt;&lt;/EM&gt;
&lt;TABLE class="" width="100%" bgColor=#ffffcc&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=""&gt;&lt;CODE&gt;&lt;PRE&gt;&lt;EM&gt;Line 11: base.OnPreInit(e); &lt;BR&gt;Line 12: // next line crashes &lt;BR&gt;&lt;/EM&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;Line 13: ContentPageLabel.Text = "Hello, World!"; &lt;BR&gt;&lt;/FONT&gt;Line 14: } &lt;BR&gt;Line 15: &amp;lt;/script&amp;gt;&lt;/EM&gt;&lt;/PRE&gt;&lt;/CODE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/FONT&gt;
&lt;P&gt;I had to solve this problem some time ago,and&amp;nbsp; I found that once you access the Master property of you content page for the first time all controls become&amp;nbsp; instantiated. &lt;/P&gt;
&lt;P&gt;So, adding just a single line of code before label text assignment fixes the problem.&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; BACKGROUND: yellow; FONT-FAMILY: consolas; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-highlight: yellow; mso-ansi-language: uk; mso-fareast-language: uk; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt;&amp;lt;%&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: consolas; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: uk; mso-fareast-language: uk; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt;@&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: uk; mso-fareast-language: uk; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt; &lt;SPAN style="COLOR: #a31515"&gt;Page&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Language&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="C#"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;MasterPageFile&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="~/MasterPage.master"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;Title&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Untitled Page"&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND: yellow; mso-highlight: yellow"&gt;%&amp;gt; &lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Content&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Content1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ContentPlaceHolderID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="ContentPlaceHolder1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="Server"&amp;gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;Content&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Label&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="ContentPageLabel"&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;/&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt; &lt;BR&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;asp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;Content&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt; &lt;BR&gt;&lt;BR&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;script&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&amp;gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;override&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; OnPreInit(&lt;SPAN style="COLOR: #2b91af"&gt;EventArgs&lt;/SPAN&gt; e) &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{ &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;base&lt;/SPAN&gt;.OnPreInit(e); &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN style="COLOR: green"&gt;// the following line is important &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;MasterPage&lt;/SPAN&gt; master = &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.Master; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;&lt;SPAN style="COLOR: green"&gt;// unfortunately, compiler warns us that master is not used&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/STRONG&gt; &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;ContentPageLabel.Text = &lt;SPAN style="COLOR: #a31515"&gt;"Hello, World!"&lt;/SPAN&gt;; &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;} &lt;BR&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;script&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt; &lt;/P&gt;
&lt;P&gt;Note that everything works like without MasterPage with this small change.&amp;nbsp; &lt;/P&gt;</description><pubDate>Tue, 09 Oct 2007 13:49:00 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/ysolodkyy/master-page-and-preinit</guid><category>ASP.NET</category></item><item><title>Using LINQ with System.Reflection Classes</title><link>https://weblogs.asp.net:443/ysolodkyy/using-linq-with-system-reflection-classes</link><description>&lt;P&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/bb308966.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/bb308966.aspx"&gt;C# 3.0&lt;/A&gt; and &lt;A href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx"&gt;LINQ&lt;/A&gt; is not only about accessing data in relational databases and &lt;A href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx"&gt;LINQ&lt;/A&gt; queries can be used against in-memory data structures as well.&amp;nbsp; Yesterday I had to discover all methods in an assembly satisfying some criteria.&amp;nbsp; As I as playing with &lt;A href="http://msdn.microsoft.com/en-us/vstudio/aa700831.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/vstudio/aa700831.aspx"&gt;Visual Studio 2008 Beta 2&lt;/A&gt; I tried to use new language features everywhere (well, even where it was unnecessary).&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I used Linq to filter my classes and methods and wrote this code in a functional style as I am not familiar with &lt;A href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx"&gt;LINQ&lt;/A&gt; query syntax in &lt;A href="http://msdn.microsoft.com/en-us/library/bb308966.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/bb308966.aspx"&gt;C# 3.0&lt;/A&gt;.&lt;/P&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: consolas; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: uk; mso-fareast-language: uk; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt;public&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: uk; mso-fareast-language: uk; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt; &lt;SPAN style="COLOR: #2b91af"&gt;IEnumerable&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;Action&lt;/SPAN&gt;&amp;gt; LocateActions() &lt;BR&gt;{ &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; GetType().Assembly.GetTypes() &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;.Where(v =&amp;gt; v.GetCustomAttributes( &lt;BR&gt;&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;typeof&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #2b91af"&gt;ActionContainerAttribute&lt;/SPAN&gt;), &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;).Length &amp;gt; 0) &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;.SelectMany(v =&amp;gt; v.GetMethods(&lt;SPAN style="COLOR: #2b91af"&gt;BindingFlags&lt;/SPAN&gt;.Public | &lt;BR&gt;&lt;SPAN style="COLOR: #2b91af"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindingFlags&lt;/SPAN&gt;.Instance)) &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;.Where(v =&amp;gt; v.GetCustomAttributes( &lt;BR&gt;&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;typeof&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #2b91af"&gt;ActionAttribute&lt;/SPAN&gt;), &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;).Length &amp;gt; 0) &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;.Select(v =&amp;gt; &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;Action&lt;/SPAN&gt;(v)); &lt;BR&gt;}&lt;/SPAN&gt; 
&lt;P&gt;My first version works fine for me; I created the second and third versions just to see what is the most readable.&amp;nbsp; So, the second version of the same method is C# 2.0:&lt;/P&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: consolas; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: uk; mso-fareast-language: uk; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt;public&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: uk; mso-fareast-language: uk; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt; &lt;SPAN style="COLOR: #2b91af"&gt;IEnumerable&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;Action&lt;/SPAN&gt;&amp;gt; LocateActions2() &lt;BR&gt;{ &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;foreach&lt;/SPAN&gt; (&lt;SPAN style="COLOR: #2b91af"&gt;Type&lt;/SPAN&gt; t &lt;SPAN style="COLOR: blue"&gt;in&lt;/SPAN&gt; GetType().Assembly.GetTypes()) &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{ &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (t.GetCustomAttributes( &lt;BR&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #2b91af"&gt;ActionContainerAttribute&lt;/SPAN&gt;), &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;).Length &amp;gt; 0) &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{ &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;foreach&lt;/SPAN&gt; (&lt;SPAN style="COLOR: #2b91af"&gt;MethodInfo&lt;/SPAN&gt; mi &lt;SPAN style="COLOR: blue"&gt;in&lt;/SPAN&gt; t.GetMethods(&lt;SPAN style="COLOR: #2b91af"&gt;BindingFlags&lt;/SPAN&gt;.Public | &lt;BR&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;BindingFlags&lt;/SPAN&gt;.Instance)) &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{ &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (mi.GetCustomAttributes(&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #2b91af"&gt;ActionAttribute&lt;/SPAN&gt;), &lt;BR&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;true&lt;/SPAN&gt;).Length &amp;gt; 0) &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{ &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;yield&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;Action&lt;/SPAN&gt;(mi); &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;} &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;} &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;} &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;} &lt;BR&gt;} &lt;BR style="mso-special-character: line-break"&gt;&lt;BR style="mso-special-character: line-break"&gt;&lt;/SPAN&gt;
&lt;P&gt;and I got the last one from C# 2.0 code.&lt;/P&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: consolas; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: uk; mso-fareast-language: uk; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt;public&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: uk; mso-fareast-language: uk; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt; &lt;SPAN style="COLOR: #2b91af"&gt;IEnumerable&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;Action&lt;/SPAN&gt;&amp;gt; LocateActions3() &lt;BR&gt;{ &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return &lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: consolas; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-us; mso-fareast-language: uk; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: uk; mso-fareast-language: uk; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: consolas; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: uk; mso-fareast-language: uk; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt;from&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: uk; mso-fareast-language: uk; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt; t &lt;SPAN style="COLOR: blue"&gt;in&lt;/SPAN&gt; GetType().Assembly.GetTypes() &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;where&lt;/SPAN&gt; &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;t.GetCustomAttributes(&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #2b91af"&gt;ActionContainerAttribute&lt;/SPAN&gt;),&lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;).Length&amp;gt; 0 &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;from&lt;/SPAN&gt; mi &lt;SPAN style="COLOR: blue"&gt;in&lt;/SPAN&gt; t.GetMethods(&lt;SPAN style="COLOR: #2b91af"&gt;BindingFlags&lt;/SPAN&gt;.Public | &lt;SPAN style="COLOR: #2b91af"&gt;BindingFlags&lt;/SPAN&gt;.Instance) &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-us; mso-fareast-language: uk; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: uk; mso-fareast-language: uk; mso-bidi-language: ar-sa; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;where &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;mi.GetCustomAttributes(&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #2b91af"&gt;ActionAttribute&lt;/SPAN&gt;), &lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;).Length &amp;gt; 0 &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;select&lt;/SPAN&gt; &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;Action&lt;/SPAN&gt;(mi); &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;} &lt;BR&gt;}&lt;/SPAN&gt; 
&lt;P&gt;The first one remains for me the most clear and easy to read, but I believe that not everyone will agree with me.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Which one is the easiest to read for you?&lt;/P&gt;</description><pubDate>Sat, 06 Oct 2007 22:54:00 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/ysolodkyy/using-linq-with-system-reflection-classes</guid><category>C#</category><category>Linq</category><category>Orcas</category></item><item><title>Browsing Google Search Results too Fast?</title><link>https://weblogs.asp.net:443/ysolodkyy/browsing-google-search-results-too-fast</link><description>&lt;p&gt;&lt;a href="https://aspblogs.blob.core.windows.net/media/ysolodkyy/WindowsLiveWriter/BrowsingGoogleSearchResultstooFast_13A98/GoogleError_2.jpg"&gt;&lt;img id="id" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="256" alt="GoogleError" src="https://aspblogs.blob.core.windows.net/media/ysolodkyy/WindowsLiveWriter/BrowsingGoogleSearchResultstooFast_13A98/GoogleError_thumb.jpg" width="524" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Well, I was clicking next and next attempting to find relevant results.A0 I have a reason to try another search engine!&lt;/p&gt;</description><pubDate>Fri, 05 Oct 2007 19:27:09 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/ysolodkyy/browsing-google-search-results-too-fast</guid><category>Personal</category></item><item><title>Control Builders &amp; ASP.NET Generic Control Classes</title><link>https://weblogs.asp.net:443/ysolodkyy/control-builders-amp-asp-net-generic-control-classes</link><description>&lt;P&gt;Since the release of .NET 2.0 and ASP.NET 2.0 I was very disappointed that new language power of C# 2.0 is not available for ASP.NET developers.&amp;nbsp; It was stressed at the time of release by multiple people (see &lt;A href="http://www.tkachenko.com/blog/archives/000278.html" target=_blank mce_href="http://www.tkachenko.com/blog/archives/000278.html"&gt;here&lt;/A&gt;, &lt;A href="http://blogs.msdn.com/mikhailarkhipov/archive/2004/08/18/216957.aspx" target=_blank mce_href="http://blogs.msdn.com/mikhailarkhipov/archive/2004/08/18/216957.aspx"&gt;here&lt;/A&gt; and &lt;A href="http://weblogs.asp.net/James_Crowley/archive/2004/08/18/216420.aspx?Pending=true" target=_blank mce_href="http://weblogs.asp.net/James_Crowley/archive/2004/08/18/216420.aspx?Pending=true"&gt;here&lt;/A&gt;).&amp;nbsp; While generic classes are not supported in ASP.NET markup in general, it seemed to me that it is still possible to benefit from generic in ASP.NET in many cases.&lt;/P&gt;
&lt;P&gt;ASP.NET supports "control builders" abstraction controlling different aspects of code generation.&amp;nbsp; The most important is that control builders define the actual type of page field for the control and actual class of the control to be instantiated.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Moreover, if control builder returns generic type, ASP.NET generates code which successfully instantiate it and page field is also correct.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;As a small sample I created a generic enumeration drop-down list control.&amp;nbsp; This control has a TypedValue property returning the currently selected enumeration member.&amp;nbsp; Type of this property is controlled from the EnumType attribute in the ASPX markup.&amp;nbsp; The following markup&lt;/P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;t&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;EnumDropDown&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;runat&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="server"&lt;/SPAN&gt; &lt;STRONG&gt;&lt;SPAN style="COLOR: red"&gt;EnumType&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="MyEnum"&lt;/SPAN&gt;&lt;/STRONG&gt; &lt;SPAN style="COLOR: red"&gt;ID&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="TheDropDown"&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;BR style="mso-special-character: line-break"&gt;&lt;BR style="mso-special-character: line-break"&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="mso-ansi-language: en-us"&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="mso-ansi-language: en-us"&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;/SPAN&gt;
&lt;P&gt;allows to use TheDropDown in code behind in a statically typed manner:&lt;/P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: uk; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: uk; mso-bidi-language: ar-sa"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;MyEnum&lt;/SPAN&gt;? atr = TheDropDown.TypedValue; &lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: uk; mso-bidi-language: ar-sa"&gt;&lt;BR style="mso-special-character: line-break"&gt;&lt;/SPAN&gt;
&lt;P&gt;If you find the temporary C# file for the web page, you can see that TheDropDown field is declared as:&lt;/P&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: uk; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: uk; mso-bidi-language: ar-sa"&gt;&amp;nbsp;&amp;nbsp; protected&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: uk; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: uk; mso-bidi-language: ar-sa"&gt; &lt;SPAN style="COLOR: blue"&gt;global&lt;/SPAN&gt;::CouldBeDone.GenericControls.EnumDropDown&lt;STRONG&gt;&amp;lt;MyEnum&amp;gt;&lt;/STRONG&gt; &lt;BR&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TheDropDown;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: uk; mso-bidi-language: ar-sa"&gt; &lt;BR style="mso-special-character: line-break"&gt;&lt;BR style="mso-special-character: line-break"&gt;&lt;/SPAN&gt;
&lt;P&gt;The trick in getting this behavior is in custom control builder class which tells ASP.NET to use generic version of the class instead of non-generic.&amp;nbsp; So, at first I created a non-generic version of EnumDropDown and decorated it with ControlBuilder attribute. &lt;/P&gt;
&lt;P class=MsoNormal style="mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;[&lt;SPAN style="COLOR: #2b91af"&gt;ControlBuilder&lt;/SPAN&gt;(&lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #2b91af"&gt;EnumDropDownControlBuilder&lt;/SPAN&gt;))]&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;EnumDropDown&lt;/SPAN&gt; : &lt;SPAN style="COLOR: #2b91af"&gt;DropDownList&lt;/SPAN&gt; {&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt; m_EnumType;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt; EnumType {&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;get&lt;/SPAN&gt; {&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; m_EnumType;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;set&lt;/SPAN&gt; { m_EnumType = &lt;SPAN style="COLOR: blue"&gt;value&lt;/SPAN&gt;; }&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="mso-ansi-language: en-us"&gt; &lt;BR&gt;&lt;BR style="mso-special-character: line-break"&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="mso-ansi-language: en-us"&gt;The generic version of EnumDropDown which is used in web pages provides all useful features (like type Value property).&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: uk; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: uk; mso-bidi-language: ar-sa"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;EnumDropDown&lt;/SPAN&gt;&amp;lt;T&amp;gt; : &lt;SPAN style="COLOR: #2b91af"&gt;EnumDropDown&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: #2b91af; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: uk; mso-bidi-language: ar-sa"&gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: uk; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: uk; mso-bidi-language: ar-sa"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;where&lt;/SPAN&gt; T : &lt;SPAN style="COLOR: blue"&gt;struct&lt;/SPAN&gt; {&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: uk; mso-bidi-language: ar-sa"&gt; &lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: uk; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: uk; mso-bidi-language: ar-sa"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; T? TypedValue {&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: uk; mso-bidi-language: ar-sa"&gt; &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;//// implementation removed &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: uk; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: uk; mso-bidi-language: ar-sa"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: uk; mso-bidi-language: ar-sa"&gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: uk; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: uk; mso-bidi-language: ar-sa"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: uk; mso-bidi-language: ar-sa"&gt; &lt;BR style="mso-special-character: line-break"&gt;&lt;BR style="mso-special-character: line-break"&gt;&lt;/SPAN&gt;The EnumDropDownControlBuilder does only one thing.&amp;nbsp; It replaces the type of control to be instantiated. &lt;BR&gt;
&lt;P class=MsoNormal style="mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;override&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Init(&lt;SPAN style="COLOR: #2b91af"&gt;TemplateParser&lt;/SPAN&gt; parser, &lt;SPAN style="COLOR: #2b91af"&gt;ControlBuilder &lt;BR&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;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;parentBuilder, &lt;SPAN style="COLOR: #2b91af"&gt;Type&lt;/SPAN&gt; type, &lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;string&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt; tagName, &lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt; id, &lt;SPAN style="COLOR: #2b91af"&gt;IDictionary&lt;/SPAN&gt; attribs) {&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt; enumTypeName = (&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;)attribs[&lt;SPAN style="COLOR: #a31515"&gt;"EnumType"&lt;/SPAN&gt;];&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;Type&lt;/SPAN&gt; enumType = &lt;SPAN style="COLOR: #2b91af"&gt;Type&lt;/SPAN&gt;.GetType(enumTypeName);&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;Type&lt;/SPAN&gt; dropDownType = &lt;BR&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;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;typeof&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #2b91af"&gt;EnumDropDown&lt;/SPAN&gt;&amp;lt;&amp;gt;).MakeGenericType(enumType);&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;base&lt;/SPAN&gt;.Init(parser, parentBuilder, dropDownType, &lt;BR&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tagName, id, attribs);&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="mso-ansi-language: en-us"&gt; &lt;BR&gt;&lt;BR style="mso-special-character: line-break"&gt;This was a very simple case.&amp;nbsp;&amp;nbsp; The most important place where I like to see static typing in ASP.NET is data binding.&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN lang=EN-US style="mso-ansi-language: en-us"&gt;I tried to apply this technique to get typed Repeater and new ListView controls and stop using Eval and type casting in data binding expressions.&amp;nbsp; I managed to get a result, but unfortunately it requires wrapping templates into special placeholder controls.&amp;nbsp; I will probably make one more post about generic classes in ASP.NET, if I can get typed data binding more simple. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="mso-layout-grid-align: none"&gt;&lt;SPAN lang=EN-US style="mso-ansi-language: en-us"&gt;If you like to see live EnumDropDown, here is the sample Visual Studio project: &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;A title=GenericEnumDropDown.zip href="https://aspblogs.blob.core.windows.net/media/ysolodkyy/downloads/GenericEnumDropDown.zip" mce_href="https://aspblogs.blob.core.windows.net/media/ysolodkyy/downloads/GenericEnumDropDown.zip"&gt;GenericEnumDropDown.zip&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;The web site was create in beta 2 of Visual Studio 2008, but as it targets .net 2.0, I hope it should run fine in VS 2005 as well.&lt;/P&gt;</description><pubDate>Mon, 01 Oct 2007 21:07:00 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/ysolodkyy/control-builders-amp-asp-net-generic-control-classes</guid><category>ASP.NET</category></item><item><title>ASP.NET AJAX Extensions and IFRAMEs</title><link>https://weblogs.asp.net:443/ysolodkyy/asp-net-ajax-extensions-and-iframes</link><description>&lt;P&gt;The &lt;A href="http://asp.net/AJAX/Documentation/Live/overview/UpdatePanelOverview.aspx" target=_blank mce_href="http://asp.net/AJAX/Documentation/Live/overview/UpdatePanelOverview.aspx"&gt;UpdatePanel&lt;/A&gt; control is a little similar to the HTML IFRAME element.&amp;nbsp; Both provide a way to update a web page partially without reloading a full browser window.&amp;nbsp; However while they both are use for similar purposes they &lt;A href="http://asp.net/AJAX/Documentation/Live/overview/UpdatePanelOverview.aspx" target=_blank mce_href="http://asp.net/AJAX/Documentation/Live/overview/UpdatePanelOverview.aspx"&gt;UpdatePanel&lt;/A&gt; and &lt;A href="http://www.w3.org/TR/html4/present/frames.html#h-16.5" target=_blank mce_href="http://www.w3.org/TR/html4/present/frames.html#h-16.5"&gt;IFRAME&lt;/A&gt; are very different on the server side. &lt;/P&gt;
&lt;P&gt;Typically web sites powered by ASP.NET with AJAX Extensions there are no need to use &lt;A href="http://www.w3.org/TR/html4/present/frames.html#h-16.5" target=_blank mce_href="http://www.w3.org/TR/html4/present/frames.html#h-16.5"&gt;IFRAME&lt;/A&gt;s, but iframes are still useful for several reasons:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;IFrame allow easy integration between ASP.NET and non ASP.NET applications.&amp;nbsp; (This is useful say if you have an old ASP application) &lt;/LI&gt;
&lt;LI&gt;If your web page has generates much view state data, iframes may be used to separate part of the page &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;So, if you find that &lt;A href="http://www.w3.org/TR/html4/present/frames.html#h-16.5" target=_blank mce_href="http://www.w3.org/TR/html4/present/frames.html#h-16.5"&gt;IFRAME&lt;/A&gt;s are still useful for you, you will probably need to interact between &lt;A href="http://www.w3.org/TR/html4/present/frames.html#h-16.5" target=_blank mce_href="http://www.w3.org/TR/html4/present/frames.html#h-16.5"&gt;IFRAME&lt;/A&gt; and parent web page.&amp;nbsp; The most typical need is to trigger some action in the parent page.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Today while answering a question on asp.net forums I decided to describe how to achieve this with more details.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;IFrame element can see the parent window as:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE class=code&gt; &lt;FONT face="Consolas,Courier New" size=2&gt;window.parent&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;While this is absolutely correct way to talk to parent web page, I prefer slightly different approach.&amp;nbsp; Personally I consider &lt;A href="http://www.w3.org/TR/html4/present/frames.html#h-16.5" target=_blank mce_href="http://www.w3.org/TR/html4/present/frames.html#h-16.5"&gt;IFRAME&lt;/A&gt; as a component and I don't want it to know much about the page hosting it.&amp;nbsp; So, I would rather expect the parent to tell &lt;A href="http://www.w3.org/TR/html4/present/frames.html#h-16.5" target=_blank mce_href="http://www.w3.org/TR/html4/present/frames.html#h-16.5"&gt;IFRAME&lt;/A&gt; hosted page how to interact with the parent page.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;This can be easily done by adding required methods to the iframe window from the parent page, like:&lt;/P&gt;
&lt;P class=MsoNormal style="mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;script&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;type&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="text/javascript"&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;function&lt;/SPAN&gt; setup() {&amp;nbsp;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;var&lt;/SPAN&gt; ifr = $get(&lt;SPAN style="COLOR: #a31515"&gt;'IFrame'&lt;/SPAN&gt;);&amp;nbsp;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;ifr.contentWindow.doRefreshUpdatePanel = &lt;SPAN style="COLOR: blue"&gt;function&lt;/SPAN&gt;() {&amp;nbsp;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&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;&amp;nbsp; &lt;/SPAN&gt;__doPostBack(&lt;SPAN style="COLOR: #a31515"&gt;'InternalButtonToRefreshUpdatePanel'&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #a31515"&gt;''&lt;/SPAN&gt;);&amp;nbsp;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&amp;nbsp;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&amp;nbsp;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;script&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;iframe&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;id&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="IFrame"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;src&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="iframe.aspx"&lt;/SPAN&gt; &lt;SPAN style="COLOR: red"&gt;onload&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;="setup();"&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;iframe&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;FONT face=Consolas color=#0000ff size=2&gt;&lt;/FONT&gt;
&lt;P&gt;The sample above emulates click of the button in the &lt;A href="http://asp.net/AJAX/Documentation/Live/overview/UpdatePanelOverview.aspx" target=_blank mce_href="http://asp.net/AJAX/Documentation/Live/overview/UpdatePanelOverview.aspx"&gt;UpdatePanel&lt;/A&gt; allowing &lt;A href="http://www.w3.org/TR/html4/present/frames.html#h-16.5" target=_blank mce_href="http://www.w3.org/TR/html4/present/frames.html#h-16.5"&gt;IFRAME&lt;/A&gt; content to update the content of the &lt;A href="http://asp.net/AJAX/Documentation/Live/overview/UpdatePanelOverview.aspx" target=_blank mce_href="http://asp.net/AJAX/Documentation/Live/overview/UpdatePanelOverview.aspx"&gt;UpdatePanel&lt;/A&gt; in the parent page. &lt;/P&gt;
&lt;P&gt;IFrame content can use functions provided by the parent page by invoking them directly on window object:&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;function&lt;/SPAN&gt; refreshUpdatePanel() {&amp;nbsp;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;window.doRefreshUpdatePanel();&amp;nbsp;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: consolas; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;} &lt;/SPAN&gt;&lt;/P&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;The complete sample code is available for &lt;A href="https://aspblogs.blob.core.windows.net/media/ysolodkyy/downloads/iframe.zip" target=_blank mce_href="https://aspblogs.blob.core.windows.net/media/ysolodkyy/downloads/iframe.zip"&gt;download&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;&amp;nbsp;&lt;/P&gt;</description><pubDate>Fri, 28 Sep 2007 20:50:00 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/ysolodkyy/asp-net-ajax-extensions-and-iframes</guid><category>AJAX</category><category>ASP.NET</category></item><item><title>Starting</title><link>https://weblogs.asp.net:443/ysolodkyy/starting</link><description>&lt;p&gt;Not actually starting, rather moving from &lt;a href="http://couldbedone.blogspot.com"&gt;http://couldbedone.blogspot.com&lt;/a&gt;.A0 Thanks to Joe Stagner for allowing me to host my blog at &lt;a href="http://www.asp.net"&gt;www.asp.net&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;It happens that I primarily post on different problems and workarounds in ASP.NET and related topics, so you can expect more going on here.A0 I have a lot to do with Ajax Control Toolkit these days, so this it be likely another topic here.A0 &lt;/p&gt;  &lt;p&gt;I have some ideas on what can be done with new C# 3.0 and LINQ.A0 I will write about this once they are finally realized by me. &lt;/p&gt;  &lt;p&gt;I haven't answered some comments as I was on vacations recently.A0 Those related to Accordion control I will address in a separate post.&lt;/p&gt;</description><pubDate>Thu, 27 Sep 2007 18:26:24 GMT</pubDate><guid isPermaLink="true">https://weblogs.asp.net:443/ysolodkyy/starting</guid></item></channel></rss>