<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>C#</title>
        <link>http://blog.colinmackay.net/category/15.aspx</link>
        <description>C#</description>
        <language>en-GB</language>
        <copyright>Colin Angus Mackay</copyright>
        <managingEditor>colin.mackay@gmail.com</managingEditor>
        <generator>Subtext Version 1.9.0.27</generator>
        <item>
            <title>Mixins in .NET (again)</title>
            <link>http://blog.colinmackay.net/archive/2008/08/10/3302.aspx</link>
            <description>&lt;p&gt;A while ago I wrote about &lt;a href="http://blog.colinmackay.net/archive/2008/02/24/1895.aspx" target="_blank"&gt;Mixins in C# 3.0&lt;/a&gt;, at the time I was saying that you can get some of the functionality, but not all, from some of the new language features in C#3.0. The solution is a bit of a fudge because the language doesn't support the concept. I've been looking at &lt;a href="http://www.remobjects.com/product/page.asp?id={E10F7F5C-AE94-4833-9E4B-2EDD5ED69768}" target="_blank"&gt;Oxygene&lt;/a&gt; recently and it has some language features that go a bit further than C# does and will support greater mixin-like functionality which it calls interface delegation. &lt;/p&gt;  &lt;p&gt;Interface delegation is again a bit of a fudge, but not quite like C#. In this case the language supports this mixin-like functionality and the fudge happens in the compiler. Let's take the class hierarchy that I used the last time:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a title="Class-Diagram-2 by Colin  Angus Mackay, on Flickr" href="http://www.flickr.com/photos/colinangusmackay/2287423942/"&gt;&lt;img height="405" alt="Class-Diagram-2" src="http://farm3.static.flickr.com/2112/2287423942_1be2458fac_o.png" width="658" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In Oxygene the Dog class looks like this:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;interface&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;D&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;=&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;,&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;,&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;f&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;c&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;D&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;x&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;f&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;c&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;D&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;x&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;protected&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;From this we can see that &lt;strong&gt;Dog&lt;/strong&gt; inherits from &lt;strong&gt;Mammal&lt;/strong&gt; and implements &lt;strong&gt;IRun&lt;/strong&gt; and &lt;strong&gt;ISwim&lt;/strong&gt;. The &lt;strong&gt;IRun&lt;/strong&gt; interface has one method (&lt;strong&gt;Run&lt;/strong&gt;), and the &lt;strong&gt;ISwim&lt;/strong&gt; interface has only one method also (&lt;strong&gt;Swim&lt;/strong&gt;). Of course, there could be as many methods and properties as you like.&lt;/p&gt;

&lt;p&gt;The C# version of the Dog class, as produced by Reflector, looks like this:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;D&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;,&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;,&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;{&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="rem"&gt;// Fields&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;x&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;f&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;c&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;D&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;x&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;f&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;c&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;D&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="rem"&gt;// Methods&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;{&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;f&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;c&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;D&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;}&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;{&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;f&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;c&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;D&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;}&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;}&lt;/pre&gt;

&lt;p&gt;As you can see, there are two private fields holding a reference to the appropriate mixin, in each of the methods the responsibility for carrying out the action is delegated to the appropriate surrogate mixin object.&lt;/p&gt;

&lt;p&gt;What you will also notice is that you still have to instantiate the surrogate mixin objects. Under normal circumstances that would be in the constructor. If it were a real mixin you wouldn't have the option as the mixin would be created at the same time as the object it is used with. In fact, the mixin would be &lt;em&gt;mixed in&lt;/em&gt; as part of the object itself. So, perhaps interface delegates gives you slightly greater power than with a real mixin as you could reuse the surrogate mixin object. Then again, would you want to? I've not been able to think of a scenario where I would, but perhaps it could be useful.&lt;/p&gt;

&lt;p&gt;I'd like to see interface delegates in C# at some point in the future (sooner rather than later). In fact, I'd like to see proper mixin functionality, but I recon that will require changes to the CLR to support multiple inheritance. In the meantime, I think I'll have to write some sort of snippet in C# to quickly generate the code that Oxygene gives me in one line. Either that or start writing in Oxygene... Now, there's a thought!&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c4866e66-ce36-4e3d-a1b1-4a4c4b588b76" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Oxygene" rel="tag"&gt;Oxygene&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C#" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/interface%20delegates" rel="tag"&gt;interface delegates&lt;/a&gt;,&lt;a href="http://technorati.com/tags/mixin" rel="tag"&gt;mixin&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/3302.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/08/10/3302.aspx</guid>
            <pubDate>Sun, 10 Aug 2008 23:55:22 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/3302.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/08/10/3302.aspx#feedback</comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/3302.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Crazy Extension Methods Redux (with Oxygene)</title>
            <link>http://blog.colinmackay.net/archive/2008/08/07/3260.aspx</link>
            <description>&lt;p&gt;Back in April I blogged about a &lt;a href="http://blog.colinmackay.net/archive/2008/04/16/2253.aspx" target="_blank"&gt;crazy thing you can do with extension methods in C#3.0&lt;/a&gt;. At the time I was adamant that it was a bad idea. I still think it is a bad idea, however, my thoughts have evolved a little since then and I have, possibly a solution to my hesitance to use said crazy feature.&lt;/p&gt;  &lt;p&gt;So, if you can't be bothered to click the link, here is a quick recap. You can create an extension method and call it on a null reference and it will NOT throw a &lt;strong&gt;NullReferenceException&lt;/strong&gt; like a real method call would. At the time I was saying it was not best practice because it breaks the semantics of the &lt;a href="http://msdn.microsoft.com/en-gb/library/6zhxzbds.aspx" target="_blank"&gt;dot operator&lt;/a&gt; which is used for member access.&lt;/p&gt;  &lt;p&gt;Last night, I attended an excellent talk by Barry Carr on &lt;a href="http://www.remobjects.com/product/?id={DC0A9947-5FED-4D34-8CC8-F2DCFA87A1FE}" target="_blank"&gt;Oxygene&lt;/a&gt;, an Object Pascal based language that targets the .NET Framework. Oxygene has a very interesting feature, it has a special operator for dealing with calls on a reference that might be null. If that language can do it, what's so wrong with the functionality that Extension methods potentially give? Semantics. Notice that I said that Oxygene has "a special operator". It doesn't use the dot operator. The dot operator still breaks if the reference is null. It has a &lt;a href="http://wiki.remobjects.com/wiki/Colon_Operator" target="_blank"&gt;colon operator&lt;/a&gt;. In this case if the reference is null (or nil as it is called in Oxygene) then the call to the method doesn't happen. No exception is thrown.&lt;/p&gt;  &lt;p&gt;For example. Here is the code with the regular dot operator:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;strong&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;A&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt;=&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;b&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;W&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="str"&gt;'The string length is {0}'&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;,&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g.L&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;And the result is that the &lt;strong&gt;NullReferenceException&lt;/strong&gt; is thrown:&lt;/p&gt;

&lt;p&gt;&lt;a title="NullReferenceException by Colin  Angus Mackay, on Flickr" href="http://www.flickr.com/photos/colinangusmackay/2741458987/"&gt;&lt;img height="333" alt="NullReferenceException" src="http://farm3.static.flickr.com/2233/2741458987_8e2a47474a_o.png" width="894" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the code with the colon operator:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;strong&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;A&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt;=&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;b&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;W&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="str"&gt;'The string length is {0}'&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;,&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;And the result is that the program works, it just didn't call the property Length as there was nothing to call it on:&lt;/p&gt;

&lt;p&gt;&lt;a title="Result by Colin  Angus Mackay, on Flickr" href="http://www.flickr.com/photos/colinangusmackay/2742296104/"&gt;&lt;img height="363" alt="Result" src="http://farm4.static.flickr.com/3019/2742296104_c42882aee0_o.png" width="702" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point I really would like to show you what this looks like in Reflector to show you what is going on under the hood, however, I get a message that says "This item is obfuscated and can not be translated" and the code afterwards isn't quite right. However, the crux of it is like this in C#:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;int? length;
    &lt;br /&gt;if (myString != null)

    &lt;br /&gt;    length = myString.Length;

    &lt;br /&gt;Console.WriteLine("The string length is {0}", length);&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, back to these extension methods. After seeing this I was thinking that perhaps my total unacceptablity of allowing a null reference to be used with an extension method was perhaps incorrect. In a normal situation with an accidental null reference exception being used the &lt;strong&gt;NullReferenceException&lt;/strong&gt; wouldn't be thrown at the point of the method call (after all, the null reference is actually being passed in as the first parameter in an extension method), but somewhere in the method itself. Normal good practice would place a guard block at the start of the method so that it would be caught immediately.&lt;/p&gt;

&lt;p&gt;However, what if you wanted to create similar functionality to the colon operator in Oxygene and have it ignore the null reference and do nothing? Well, my advice would be to create a naming convention for your extension methods to show that null references will be ignored. That way you can get the functionality with a slight semantic fudge of the dot operator. Of course, you still have to do the work and set up guard blocks to handle the null situation yourself in the extension method.&lt;/p&gt;

&lt;p&gt;Here's an example:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;P&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;{&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;string&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;[&lt;span class="kwrd"&gt;&lt;/span&gt;]&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;{&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;=&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;W&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="str"&gt;"The string length is {0}"&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;,&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;N&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;b&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;}&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;}&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;E&lt;span class="kwrd"&gt;&lt;/span&gt;x&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;{&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;?&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;N&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;b&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;{&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;=&lt;span class="kwrd"&gt;&lt;/span&gt;=&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;}&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;}&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f636dd39-cbf7-49f5-acba-d8eae1c060a7" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/extension%20methods" rel="tag"&gt;extension methods&lt;/a&gt;,&lt;a href="http://technorati.com/tags/dot%20operator" rel="tag"&gt;dot operator&lt;/a&gt;,&lt;a href="http://technorati.com/tags/colon%20operator" rel="tag"&gt;colon operator&lt;/a&gt;,&lt;a href="http://technorati.com/tags/c#" rel="tag"&gt;c#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/oxygene" rel="tag"&gt;oxygene&lt;/a&gt;,&lt;a href="http://technorati.com/tags/semantics" rel="tag"&gt;semantics&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/3260.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/08/07/3260.aspx</guid>
            <pubDate>Thu, 07 Aug 2008 20:45:07 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/3260.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/08/07/3260.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/3260.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Monitoring change in XML data (LINQ to XML series - Part 5)</title>
            <link>http://blog.colinmackay.net/archive/2008/07/19/2985.aspx</link>
            <description>&lt;p&gt;This is the 5th part in a series on LINQ to XML. In this instalment we will look at monitoring changes in XML data in the XML classes added to .NET 3.5.&lt;/p&gt; &lt;p&gt;The &lt;strong&gt;XObject&lt;/strong&gt; class (from which &lt;strong&gt;XElement&lt;/strong&gt; and &lt;strong&gt;XAttribute&lt;/strong&gt;, among others) contains two events that are of interest to anyone wanting to know about changes to the XML data: &lt;strong&gt;Changing&lt;/strong&gt; and &lt;strong&gt;Changed&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The &lt;strong&gt;Changing&lt;/strong&gt; event is triggered prior to a change being applied to the XML data. The &lt;strong&gt;Changed&lt;/strong&gt; event is triggered after the change has been applied.&lt;/p&gt; &lt;p&gt;An example of adding the event handler would be something like this:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;XElement &lt;/span&gt;root = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"root"&lt;/span&gt;);
root.Changed += &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;XObjectChangeEventArgs&lt;/span&gt;&amp;gt;(root_Changed);&lt;/pre&gt;
&lt;p&gt;The above example will trigger for any change that happens in the node the event handler is applied to and any node downstream of it. As the example is applied to the root node this means the event will trigger for any change in the XML data.&lt;/p&gt;
&lt;p&gt;The event handler is supplied an &lt;strong&gt;XObjectChangeEventArgs&lt;/strong&gt; object which contains an &lt;strong&gt;ObjectChange&lt;/strong&gt; property. This is an &lt;strong&gt;XObjectChange&lt;/strong&gt; enum and it lets the code know what type of change happened.&lt;/p&gt;
&lt;p&gt;The sender contains the actual object in the XML data that has changed. &lt;/p&gt;
&lt;h1&gt;Adding an element&lt;/h1&gt;
&lt;p&gt;Take the following example where an element is added to the XML data.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;XElement &lt;/span&gt;child = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"ChildElement"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"Original Value"&lt;/span&gt;);
root.Add(child);&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;In this case the &lt;strong&gt;ObjectChanged&lt;/strong&gt; is &lt;strong&gt;Add&lt;/strong&gt; and the sender is the &lt;strong&gt;XElement&lt;/strong&gt;: &amp;lt;ChildElement&amp;gt;Original Value&amp;lt;/ChildElement&amp;gt; &lt;/p&gt;
&lt;p&gt;A similar scenario happens when adding an attribute. However, instead of the sender being an &lt;strong&gt;XElement&lt;/strong&gt; it will be an &lt;strong&gt;XAttribute&lt;/strong&gt;.&lt;/p&gt;&lt;pre class="code"&gt;child.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XAttribute&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"TheAttribute"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"Some Value"&lt;/span&gt;));&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;h1&gt;Changing an element value&lt;/h1&gt;
&lt;p&gt;If the value of the element is changed (the bit that currently says "Original Value") then we don't get one event fired. We get two events fired. For example:&lt;/p&gt;&lt;pre class="code"&gt;child.Value = &lt;span style="color: #a31515"&gt;"New Value"&lt;/span&gt;;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;The first event with &lt;strong&gt;ObjectChanged&lt;/strong&gt; set to &lt;strong&gt;Remove&lt;/strong&gt; and the sender set to "Orginal Value" (which is actually an &lt;strong&gt;XText&lt;/strong&gt; object) and the second event with the &lt;strong&gt;ObjectChanged&lt;/strong&gt; set to &lt;strong&gt;Add&lt;/strong&gt; and the sender set to "New Value" (again, this is actually an &lt;strong&gt;XText&lt;/strong&gt; object).&lt;/p&gt;
&lt;h1&gt;Changing an element name&lt;/h1&gt;
&lt;p&gt;If the name of the element is changed then the &lt;strong&gt;ObjectChanged&lt;/strong&gt; property will be set to &lt;strong&gt;Name&lt;/strong&gt; and the sender will be the &lt;strong&gt;XElement&lt;/strong&gt; that has changed. &lt;/p&gt;&lt;pre class="code"&gt;child.Name = &lt;span style="color: #a31515"&gt;"JustTheChild"&lt;/span&gt;;&lt;/pre&gt;
&lt;h1&gt;Changing an attribute name&lt;/h1&gt;
&lt;p&gt;Unlike changing an element value, when the value of an attribute changes the &lt;strong&gt;ObjectChanged&lt;/strong&gt; property will be &lt;strong&gt;Value&lt;/strong&gt; and the sender will be the &lt;strong&gt;XAttribute&lt;/strong&gt;.&lt;/p&gt;&lt;pre class="code"&gt;child.Attribute(&lt;span style="color: #a31515"&gt;"TheAttribute"&lt;/span&gt;).Value = &lt;span style="color: #a31515"&gt;"New Attribute Value"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="code"&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:43bd53b7-890e-41d1-aea0-9bf6a429e724" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/c#" rel="tag"&gt;c#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.net" rel="tag"&gt;.net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.net%203.5" rel="tag"&gt;.net 3.5&lt;/a&gt;,&lt;a href="http://technorati.com/tags/xml" rel="tag"&gt;xml&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/2985.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/07/19/2985.aspx</guid>
            <pubDate>Sat, 19 Jul 2008 16:57:00 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/2985.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/07/19/2985.aspx#feedback</comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/2985.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Tip of the Day #4 (Connection Strings in Config files)</title>
            <link>http://blog.colinmackay.net/archive/2008/07/19/2983.aspx</link>
            <description>&lt;p&gt;From .NET 2.0 onwards a new and improved configuration management system has been put in place. You can now add a &lt;strong&gt;&amp;lt;connectionString&amp;gt;&lt;/strong&gt; element to the config file and use it to place the connection strings to the database and then retrieve then in a consistent way in your application. It supports multiple connection strings too if you need to access multiple databases.&lt;/p&gt;  &lt;p&gt;The config file looks like this:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;configuration&lt;/span&gt;&lt;span style="color: blue"&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;connectionStrings&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;add &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Default&lt;/span&gt;" &lt;span style="color: red"&gt;connectionString&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Server=(local);database=MyDatabase&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;connectionStrings&lt;/span&gt;&lt;span style="color: blue"&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;configuration&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/pre&gt;

&lt;p&gt;From the .NET application you can access the connection string like this:&lt;/p&gt;

&lt;pre class="code"&gt;connectionString = 
    &lt;span style="color: #2b91af"&gt;ConfigurationManager&lt;/span&gt;.ConnectionStrings[&lt;span style="color: #a31515"&gt;"Default"&lt;/span&gt;].ConnectionString;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Just remember to add a reference to System.Configuration in your project and ensure that the code file is using the System.Configuration namespace as well.&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c8a83277-e372-4388-ac90-400230209d2e" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/.net" rel="tag"&gt;.net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/connection%20string" rel="tag"&gt;connection string&lt;/a&gt;,&lt;a href="http://technorati.com/tags/config" rel="tag"&gt;config&lt;/a&gt;,&lt;a href="http://technorati.com/tags/configuration" rel="tag"&gt;configuration&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/2983.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/07/19/2983.aspx</guid>
            <pubDate>Sat, 19 Jul 2008 12:51:06 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/2983.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/07/19/2983.aspx#feedback</comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/2983.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Navigating XML (LINQ to XML series - part 4)</title>
            <link>http://blog.colinmackay.net/archive/2008/06/22/2600.aspx</link>
            <description>&lt;p&gt;In my last few posts on LINQ to XML (&lt;a href="http://blog.colinmackay.net/archive/2008/04/08/2194.aspx" target="_blank"&gt;part 1&lt;/a&gt;, &lt;a href="http://blog.colinmackay.net/archive/2008/04/12/2203.aspx" target="_blank"&gt;part 2&lt;/a&gt; and &lt;a href="http://blog.colinmackay.net/archive/2008/05/18/2376.aspx" target="_blank"&gt;part 3&lt;/a&gt;) I've shown you a starter on navigating around XML data. In this post I'll continue to show you how to navigate through XML data by showing you how to navigate around sibling elements.&lt;/p&gt;  &lt;p&gt;First consider this code:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;XElement &lt;/span&gt;root = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"root"&lt;/span&gt;,
    &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"FirstChild"&lt;/span&gt;),
    &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"SecondChild"&lt;/span&gt;),
    &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"ThirdChild"&lt;/span&gt;),
    &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"FouthChild"&lt;/span&gt;),
    &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"FifthChild"&lt;/span&gt;));&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Which produces the following XML structure:&lt;/p&gt;

&lt;p&gt;&amp;lt;root&amp;gt; 
  &lt;br /&gt;  &amp;lt;FirstChild /&amp;gt; 

  &lt;br /&gt;  &amp;lt;SecondChild /&amp;gt; 

  &lt;br /&gt;  &amp;lt;ThirdChild /&amp;gt; 

  &lt;br /&gt;  &amp;lt;FouthChild /&amp;gt; 

  &lt;br /&gt;  &amp;lt;FifthChild /&amp;gt; 

  &lt;br /&gt;&amp;lt;/root&amp;gt;&lt;/p&gt;

&lt;p&gt;We can access the &lt;strong&gt;ThirdChild&lt;/strong&gt; with this code:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;XElement &lt;/span&gt;child = root.Element(&lt;span style="color: #a31515"&gt;"ThirdChild"&lt;/span&gt;);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;From that point, we can also get access to its siblings.&lt;/p&gt;

&lt;p&gt;To access the siblings that occur before the element we have a reference to then we can use &lt;strong&gt;ElementsBeforeSelf&lt;/strong&gt;. As with &lt;strong&gt;Elements&lt;/strong&gt; this returns an &lt;strong&gt;IEnumerable&amp;lt;XElement&amp;gt;&lt;/strong&gt; object which allows us to iterate over the result, like this:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;&amp;gt; elements = child.ElementsBeforeSelf();

&lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;XElement &lt;/span&gt;element &lt;span style="color: blue"&gt;in &lt;/span&gt;elements)
    &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(element);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;The result is:&lt;/p&gt;

&lt;p&gt;&amp;lt;FirstChild /&amp;gt; 
  &lt;br /&gt;&amp;lt;SecondChild /&amp;gt;&lt;/p&gt;

&lt;p&gt;Conversely, we can get the siblings that come after the element we have a reference to with &lt;strong&gt;ElementsAfterSelf&lt;/strong&gt;. Like this:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;&amp;gt; elements = child.ElementsAfterSelf();&lt;/pre&gt;

&lt;p&gt;The result in this case will be:&lt;/p&gt;

&lt;p&gt;&amp;lt;FouthChild /&amp;gt; 
  &lt;br /&gt;&amp;lt;FifthChild /&amp;gt;&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:6c154488-abff-4ac5-813b-32aa49c0a47b" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/c#" rel="tag"&gt;c#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.net" rel="tag"&gt;.net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.net%203.5" rel="tag"&gt;.net 3.5&lt;/a&gt;,&lt;a href="http://technorati.com/tags/xml" rel="tag"&gt;xml&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/2600.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/06/22/2600.aspx</guid>
            <pubDate>Sun, 22 Jun 2008 01:43:14 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/2600.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/06/22/2600.aspx#feedback</comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/2600.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Postgraduate .NET Application Development</title>
            <link>http://blog.colinmackay.net/archive/2008/06/20/2593.aspx</link>
            <description>&lt;a target="_blank" href="http://www.gcal.ac.uk/"&gt;Glasgow Caledonian University&lt;/a&gt; is currently developing a new Postgraduate course on .NET Application Development. This course will combine the expertise of their lecturers with the industry-standard Microsoft Official Curriculum. This course will offer a series of academic qualifications, starting with a Postgraduate Certificate and potentially leading on to a Postgraduate Diploma and an MSc, and will also provide preparation for Microsoft Certification in .NET specialist areas. A Postgraduate Certificate is likely to take 3 months of full-time study or 6 months part-time. A full MSc takes 1 calendar year of full-time study and 2 to 3 years part-time.&lt;br /&gt;
&lt;br /&gt;
The university has a short survey that is designed to find out how they can best deliver this course to meet the needs of potential students. They are interested in the views of potential students, employers who wish to develop staff and employers who recruit developers. If you think the course might be of interest to you, please take a moment to answer these questions.&lt;br /&gt;
&lt;br /&gt;
The survey can be found &lt;a target="_blank" href="http://www.surveymonkey.com/s.aspx?sm=Rj_2bK9gZDT1zczxje_2bIO5hA_3d_3d"&gt;here&lt;/a&gt;&lt;img src="http://blog.colinmackay.net/aggbug/2593.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/06/20/2593.aspx</guid>
            <pubDate>Fri, 20 Jun 2008 13:01:49 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/2593.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/06/20/2593.aspx#feedback</comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/2593.aspx</wfw:commentRss>
        </item>
        <item>
            <title>ASP.NET / C# contract in Windsor</title>
            <link>http://blog.colinmackay.net/archive/2008/06/20/2592.aspx</link>
            <description>&lt;p&gt;There seems to be lots of opportunity for .NET developers at the moment. Another friend of mine contacted me about a job he has available for any suitable person that is interested. This time it is a contractor position based in Windsor in England and he tells me it is a great place to work.&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p&gt;Skills:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;ASP.NET &lt;/li&gt;
    &lt;li&gt;C# 2.0 &lt;/li&gt;
    &lt;li&gt;SQL Server 2000/2005 &lt;/li&gt;
    &lt;li&gt;Javascript and AJAX experience &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The successful candidate will be involved in all aspects of the software lifecycle. Rates are the market rates for the south east of England. The start date is ASAP and the contract will last for 3 months initially.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He's also told me he isn't interested in hearing from recruitment agents, so if you are one, don't annoy him by trying - you won't get anywhere.&lt;/p&gt;
&lt;p&gt;If you are initerested you can get in touch with either Daniel Molloy at &lt;a href="mailto:daniel_t_molloy@hotmail.com"&gt;daniel_t_molloy@hotmail.com&lt;/a&gt; or Ross Mardell at &lt;a href="mailto:ross.mardell@btinternet.com"&gt;ross.mardell@btinternet.com&lt;/a&gt; &lt;/p&gt;&lt;img src="http://blog.colinmackay.net/aggbug/2592.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/06/20/2592.aspx</guid>
            <pubDate>Fri, 20 Jun 2008 11:58:26 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/2592.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/06/20/2592.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/2592.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Navigating XML (LINQ to XML series - Part 3)</title>
            <link>http://blog.colinmackay.net/archive/2008/05/18/2376.aspx</link>
            <description>&lt;p&gt;In my last two posts (&lt;a href="http://blog.colinmackay.net/archive/2008/04/08/2194.aspx" target="_blank"&gt;part 1&lt;/a&gt; and &lt;a href="http://blog.colinmackay.net/archive/2008/04/12/2203.aspx" target="_blank"&gt;part 2&lt;/a&gt;) I've been introducing you to the the new XML classes in .NET 3.5. In this post I'll continue that and show you some of the ways to navigate through XML.&lt;/p&gt;  &lt;p&gt;First of all, lets start with a simple hierarchy of XML elements:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;XElement &lt;/span&gt;root = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"FirstGeneration"&lt;/span&gt;,
                    &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"SecondGeneration"&lt;/span&gt;,
                        &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"ThirdGeneration"&lt;/span&gt;,
                            &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"FourthGeneration"&lt;/span&gt;))));&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Which looks like this when rendered as XML:&lt;/p&gt;

&lt;p&gt;&amp;lt;FirstGeneration&amp;gt; 
  &lt;br /&gt;  &amp;lt;SecondGeneration&amp;gt; 

  &lt;br /&gt;    &amp;lt;ThirdGeneration&amp;gt; 

  &lt;br /&gt;      &amp;lt;FourthGeneration /&amp;gt; 

  &lt;br /&gt;    &amp;lt;/ThirdGeneration&amp;gt; 

  &lt;br /&gt;  &amp;lt;/SecondGeneration&amp;gt; 

  &lt;br /&gt;&amp;lt;/FirstGeneration&amp;gt;&lt;/p&gt;

&lt;p&gt;Also in the last post I used Element to get a specific element from the current element. For example:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;XElement &lt;/span&gt;child = root.Element(&lt;span style="color: #a31515"&gt;"SecondGeneration"&lt;/span&gt;);&lt;/pre&gt;

&lt;h1&gt;Elements&lt;/h1&gt;

&lt;p&gt;If root (or FirstGeneration) only had one child element called "SecondGeneration" then everything is fine, you get what you asked for. However, if it contains multiple children all called "SecondGeneration" then you will only get the first element called "SecondGeneration".&lt;/p&gt;

&lt;p&gt;For example, if you add the following to the code above:&lt;/p&gt;

&lt;pre class="code"&gt;root.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"SecondGeneration"&lt;/span&gt;,&lt;span style="color: #a31515"&gt;"2"&lt;/span&gt;));
root.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"SecondGeneration"&lt;/span&gt;,&lt;span style="color: #a31515"&gt;"3"&lt;/span&gt;));&lt;/pre&gt;

&lt;p&gt;You will get a piece of XML that looks like this:&lt;/p&gt;

&lt;p&gt;&amp;lt;FirstGeneration&amp;gt; 
  &lt;br /&gt;  &amp;lt;SecondGeneration&amp;gt; 

  &lt;br /&gt;    &amp;lt;ThirdGeneration&amp;gt; 

  &lt;br /&gt;      &amp;lt;FourthGeneration /&amp;gt; 

  &lt;br /&gt;    &amp;lt;/ThirdGeneration&amp;gt; 

  &lt;br /&gt;  &amp;lt;/SecondGeneration&amp;gt; 

  &lt;br /&gt;  &amp;lt;SecondGeneration&amp;gt;2&amp;lt;/SecondGeneration&amp;gt; 

  &lt;br /&gt;  &amp;lt;SecondGeneration&amp;gt;3&amp;lt;/SecondGeneration&amp;gt; 

  &lt;br /&gt;&amp;lt;/FirstGeneration&amp;gt;&lt;/p&gt;

&lt;p&gt;If you want to get all those additional children called "SecondGeneration" you will need to use the Elements (note the plural) method. For example:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;&amp;gt; children = root.Elements(&lt;span style="color: #a31515"&gt;"SecondGeneration"&lt;/span&gt;);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;You'll also note that we don't get a collection returned but an enumerable. This give us the opportunity to exploit many of the new extension methods. But I'll leave them for another post. For the moment, we just need to know that it make it easy for us to enumerate over the data using a foreach loop. For example:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;XElement &lt;/span&gt;child &lt;span style="color: blue"&gt;in &lt;/span&gt;children)
{
    &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(child);
    &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: blue"&gt;new string&lt;/span&gt;(&lt;span style="color: #a31515"&gt;'-'&lt;/span&gt;, 50));
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;This will write out:&lt;/p&gt;

&lt;p&gt;&amp;lt;SecondGeneration&amp;gt; 
  &lt;br /&gt;  &amp;lt;ThirdGeneration&amp;gt; 

  &lt;br /&gt;    &amp;lt;FourthGeneration /&amp;gt; 

  &lt;br /&gt;  &amp;lt;/ThirdGeneration&amp;gt; 

  &lt;br /&gt;&amp;lt;/SecondGeneration&amp;gt; 

  &lt;br /&gt;-------------------------------------------------- 

  &lt;br /&gt;&amp;lt;SecondGeneration&amp;gt;2&amp;lt;/SecondGeneration&amp;gt; 

  &lt;br /&gt;-------------------------------------------------- 

  &lt;br /&gt;&amp;lt;SecondGeneration&amp;gt;3&amp;lt;/SecondGeneration&amp;gt; 

  &lt;br /&gt;--------------------------------------------------&lt;/p&gt;

&lt;h1&gt;&lt;/h1&gt;

&lt;h1&gt;Parent&lt;/h1&gt;

&lt;p&gt;Using the same root object as above, we can see how to navigate back up the XML tree using Parent.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;XElement &lt;/span&gt;grandchild = root.Element(&lt;span style="color: #a31515"&gt;"SecondGeneration"&lt;/span&gt;).Element(&lt;span style="color: #a31515"&gt;"ThirdGeneration"&lt;/span&gt;);
&lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(grandchild.Parent);&lt;/pre&gt;

&lt;p&gt;The result of the code will be that the SecondGeneration element is printed.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:04717698-edb0-4b6d-a718-33355a226512" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/c#" rel="tag"&gt;c#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.net" rel="tag"&gt;.net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.net%203.5" rel="tag"&gt;.net 3.5&lt;/a&gt;,&lt;a href="http://technorati.com/tags/xml" rel="tag"&gt;xml&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/2376.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/05/18/2376.aspx</guid>
            <pubDate>Sun, 18 May 2008 13:55:45 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/2376.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/05/18/2376.aspx#feedback</comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/2376.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Crazy Extension Method</title>
            <link>http://blog.colinmackay.net/archive/2008/04/16/2253.aspx</link>
            <description>&lt;p&gt;Here is an example of a crazy extension method that alters the semantics of method calling.&lt;/p&gt;  &lt;p&gt;First the extension method:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public static class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MyExtensions
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;public static bool &lt;/span&gt;IsNullOrEmpty(&lt;span style="color: blue"&gt;this string &lt;/span&gt;target)
    {
        &lt;span style="color: blue"&gt;return string&lt;/span&gt;.IsNullOrEmpty(target);
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Instead of calling the static method IsNullOrEmpty() on string, we are turning it around to allow it to be called on a string type like an instance method. However, as you can probably tell, it may be called when the reference to the string is null. Normally this would result in an exception to say that you are attempting to call a method on a null value. However, this is an extension method and it actually works with nulls! This is probably not the best idea in the world, to be diplomatic about it.&lt;/p&gt;

&lt;p&gt;Here is some calling code:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;string &lt;/span&gt;a = &lt;span style="color: blue"&gt;null&lt;/span&gt;;
&lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(a.IsNullOrEmpty());&lt;/pre&gt;

&lt;p&gt;Normally, an exception will be thrown if IsNullOrEmpty() is a real method. However, it isn't in this case and the application happily writes "True" to the console.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:019eafdf-7119-4151-a171-58dc725b6478" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/extension%20method" rel="tag"&gt;extension method&lt;/a&gt;,&lt;a href="http://technorati.com/tags/exception" rel="tag"&gt;exception&lt;/a&gt;,&lt;a href="http://technorati.com/tags/weird" rel="tag"&gt;weird&lt;/a&gt;,&lt;a href="http://technorati.com/tags/c#" rel="tag"&gt;c#&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/2253.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/04/16/2253.aspx</guid>
            <pubDate>Wed, 16 Apr 2008 21:59:25 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/2253.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/04/16/2253.aspx#feedback</comments>
            <slash:comments>6</slash:comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/2253.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Event: LINQ to XML - Everything but the kitchen sinq</title>
            <link>http://blog.colinmackay.net/archive/2008/04/16/2252.aspx</link>
            <description>&lt;p&gt;I'll be speaking at the &lt;a target="_blank" href="http://www.scottishdevelopers.com/"&gt;Scottish Developers&lt;/a&gt; event in Glasgow on the 10th June 2008 at the Continuing Professional Development Centre at Glasgow Caledonian University.&lt;/p&gt;
&lt;p&gt;I've be giving an introduction to the new XML classes in .NET 3.5, how they work and what can be done with them. After the break I'll then show how the new XML classes can be used in LINQ (Language INtegrated Query) in order to get data out in the way that you want.&lt;/p&gt;
&lt;p&gt;If you want to know more about the event and to sign up please use this link: &lt;font face="Arial"&gt;&lt;a href="http://www.scottishdevelopers.com/modules/extcal/event.php?event=61"&gt;http://www.scottishdevelopers.com/modules/extcal/event.php?event=61&lt;/a&gt; &lt;/font&gt; &lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:46dd9a78-d79f-471a-9c63-dad5f6f89575" style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/c#"&gt;c#&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/linq"&gt;linq&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/xml"&gt;xml&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/linq%20to%20xml"&gt;linq to xml&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/scottish%20developers"&gt;scottish developers&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/2252.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/04/16/2252.aspx</guid>
            <pubDate>Wed, 16 Apr 2008 21:10:18 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/2252.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/04/16/2252.aspx#feedback</comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/2252.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>