<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>pushbomb &#187; Generics</title>
	<atom:link href="http://team.pushbomb.com/category/concepts-implemented/generics-tools-that-allow-the-practices-helping-the-how/feed/" rel="self" type="application/rss+xml" />
	<link>http://team.pushbomb.com</link>
	<description>tv programmed by the collective</description>
	<lastBuildDate>Tue, 05 Jan 2010 22:49:48 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='team.pushbomb.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/a08732ed34e6814d5a5513fe8cde5696?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>pushbomb &#187; Generics</title>
		<link>http://team.pushbomb.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://team.pushbomb.com/osd.xml" title="pushbomb" />
	<atom:link rel='hub' href='http://team.pushbomb.com/?pushpress=hub'/>
		<item>
		<title>Linq to Gac : Use Linq to Power Query your Gac via this C# Bridge to Fusion</title>
		<link>http://team.pushbomb.com/2008/09/20/fusion_c_sharp_wrapper_for_linq_to_gac_access/</link>
		<comments>http://team.pushbomb.com/2008/09/20/fusion_c_sharp_wrapper_for_linq_to_gac_access/#comments</comments>
		<pubDate>Sun, 21 Sep 2008 00:43:45 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[Proof Driven Development]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[concepts implemented]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[DomainDriven]]></category>
		<category><![CDATA[Fusion]]></category>
		<category><![CDATA[GAC]]></category>
		<category><![CDATA[Global Assembly Cache]]></category>
		<category><![CDATA[IEnumerable]]></category>
		<category><![CDATA[IEnumerator]]></category>
		<category><![CDATA[Internals]]></category>
		<category><![CDATA[Lambada]]></category>
		<category><![CDATA[Linq]]></category>
		<category><![CDATA[Linq to Gac]]></category>
		<category><![CDATA[Linq to Objects]]></category>
		<category><![CDATA[Machine]]></category>
		<category><![CDATA[Registry]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/09/20/fusion_c_sharp_wrapper_for_linq_to_gac_access/</guid>
		<description><![CDATA[Now we attach the Gac Here we provide a full Linq to Objects IEnumerable wrapper over the Fusion API to allow you to have all the power of Linq queries over your entire GAC (as well as most other parts of you computer you can now join on!). This is a post to get you the GAC info now, as many have asked for it (and it might be the most widely used of this work). Things do get fun however when you start joining your GAC with your files with you registry....<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=928&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblog.domaindotnet.com%2f2008%2f09%2f20%2ffusion_c_sharp_wrapper_for_linq_to_gac_access%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.domaindotnet.com%2f2008%2f09%2f20%2ffusion_c_sharp_wrapper_for_linq_to_gac_access%2f" border="0" alt="kick it on DotNetKicks.com" /></a></p>
<p><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2008%2f09%2f20%2ffusion_c_sharp_wrapper_for_linq_to_gac_access%2f&amp;title=%e2%80%98Linq+to+Gac%e2%80%99+%3a+Use+Linq+to+Power+Query+your+Gac+via+this+C%23+Bridge+to+Fusion"><img style="border-width:0;" title="Digg This" src="http://digg.com/img/badges/100x20-digg-button.png" border="0" alt="Digg This" width="100" /></a></p>
<h4>This post gets you <a href="http://en.wikipedia.org/wiki/Language_Integrated_Query" target="_blank">Linq</a> access to the GAC with no fuss.</h4>
<p>Fusion is wrapped for you so no need to understand the unmanaged stuff unless you want to. Your up and running with GAC as a new Linq to Objects source in minutes.</p>
<h2>The Big Picture of the Project (You can skip to the next section if you just want the GAC code)</h2>
<p>Note: The reason both the Gac and MyEnvironment IEnumerable&lt;T&gt; references below are different? See the reference on the bottom right of the picture into the entry point to all of it (ThisBox)?</p>
<h2>Introduction to the Fusion  IEnumerable Wrapper</h2>
<p>A simple case. I want to know how my GAC is broken into ‘Major Vendors’. We assume this is roughly the first part of the name. (i.e. Microsoft.System = Microsoft).</p>
<p>Oh yeah. Exclude the assemblies that only occur once. We are looking for the larger view here.</p>
<p>Here is an easy solution:</p>
<pre class="code"><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">        [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Fact</span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">]
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public void </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">should_show_gac_by_vendor()
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">result = </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">from </span><span style="background:black none repeat scroll 0 0;color:white;">matchedAssembly </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ThisBox</span><span style="background:black none repeat scroll 0 0;color:white;">.By&lt;</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">AssemblyDetail</span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">&gt;()
                         </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">group </span><span style="background:black none repeat scroll 0 0;color:white;">matchedAssembly </span></span><span style="background:black none repeat scroll 0 0;color:#ecc03e;"><span style="font-size:x-small;">by
                             </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">matchedAssembly.MajorName
                             </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">into </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">grouping
                             </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">where </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">grouping.Count() &gt; 1
                             </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">orderby </span><span style="background:black none repeat scroll 0 0;color:white;">grouping.Count() </span></span><span style="background:black none repeat scroll 0 0;color:#ecc03e;"><span style="font-size:x-small;">descending
                             select </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">grouping;

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">TotalSum = result.Sum(ad =&gt; ad.Count());

            </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"** ASSEMBLIES BY NAME WITH &gt; 1 REGISTERED  = {0} ***"</span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">, TotalSum);

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">foreach </span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">firstGroup </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">result)
            {
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">groupCount = firstGroup.Count();
                </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"Group '{0}' Assemblies={1} Percent={2} Public Keys Used={3}"</span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;">,
                                    firstGroup.Key,
                                    groupCount,
                                    groupCount.ToPctString(TotalSum),
                                    firstGroup.Select(ad =&gt; ad.PublicKey).Distinct().Count()
                                    );
            }
        }</span></span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<h2>** ASSEMBLIES BY NAME WITH &gt; 1 REGISTERED  = 664 ***</h2>
<p>Group &#8216;Microsoft&#8217; Assemblies=466 Percent=70.18% Public Keys Used=5<br />
Group &#8216;DevExpress&#8217; Assemblies=73 Percent=10.99% Public Keys Used=2<br />
Group &#8216;System&#8217; Assemblies=71 Percent=10.69% Public Keys Used=4<br />
Group &#8216;Policy&#8217; Assemblies=14 Percent=2.11% Public Keys Used=2<br />
Group &#8216;FSharp&#8217; Assemblies=11 Percent=1.66% Public Keys Used=1<br />
Group &#8216;VLinq&#8217; Assemblies=10 Percent=1.51% Public Keys Used=1<br />
Group &#8216;policy&#8217; Assemblies=6 Percent=0.9% Public Keys Used=2<br />
Group &#8216;PresentationFramework&#8217; Assemblies=5 Percent=0.75% Public Keys Used=1<br />
Group &#8216;mscorcfg&#8217; Assemblies=2 Percent=0.3% Public Keys Used=1<br />
Group &#8216;WebDev&#8217; Assemblies=2 Percent=0.3% Public Keys Used=1<br />
Group &#8216;VSTADTEProvider&#8217; Assemblies=2 Percent=0.3% Public Keys Used=1<br />
Group &#8216;VsWebSite&#8217; Assemblies=2 Percent=0.3% Public Keys Used=1</p>
<p><span style="font-size:x-small;"><span style="font-size:x-small;">Try that with GacUtil (grin)..</span></span></p>
<h2>C# GAC IEnumerable&lt;Assembly&gt; implementation</h2>
<p>Ah yes the GAC Fusion wrapper code.  Thanks to <a href="http://dotnetjunkies.com/WebLog/debasish/" target="_blank">Debasish Bose</a> for his help here.</p>
<h1>C# Fusion Gac Enumerable : <a href="http://blog.domaindotnet.com/">Domain.Dot.Net</a> Team</h1>
<p><a href="http://dcarr.files.wordpress.com/2008/09/classdiagram21.png"><img style="display:inline;border-width:0;" title="ClassDiagram2" src="http://dcarr.files.wordpress.com/2008/09/classdiagram2-thumb1.png?w=684" border="0" alt="ClassDiagram2" width="684" /></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Just to have some room to breath
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public class </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">AssemblyDetail </span><span style="background:black none repeat scroll 0 0;color:white;">: </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">AssemblyDetailBase
    </span><span style="background:black none repeat scroll 0 0;color:white;">{
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public </span><span style="background:black none repeat scroll 0 0;color:white;">AssemblyDetail(</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">currentAssembly) : </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">base</span><span style="background:black none repeat scroll 0 0;color:white;">(currentAssembly) {}

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String </span><span style="background:black none repeat scroll 0 0;color:white;">FullName
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_fullName;
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override string </span><span style="background:black none repeat scroll 0 0;color:white;">Version
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_versionString;
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override int </span><span style="background:black none repeat scroll 0 0;color:white;">Major
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">VersionComponent(0);
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override int </span><span style="background:black none repeat scroll 0 0;color:white;">Minor
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">VersionComponent(1);
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override int </span><span style="background:black none repeat scroll 0 0;color:white;">Revision
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">VersionComponent(2);
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override int </span><span style="background:black none repeat scroll 0 0;color:white;">Build
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">VersionComponent(3);
            }
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override string </span><span style="background:black none repeat scroll 0 0;color:white;">PublicKey
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_pkey;
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override string </span><span style="background:black none repeat scroll 0 0;color:white;">MajorName
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_majorName;
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String </span><span style="background:black none repeat scroll 0 0;color:white;">Name
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_fullName;
            }
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">VersionComponent(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">position)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_version.Length &lt;= position + 1
                           ? </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Convert</span><span style="background:black none repeat scroll 0 0;color:white;">.ToInt32(_version[position]) : 0;
        }
    }</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">    #region

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Runtime.InteropServices;

    #endregion

    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Alpha - Comment and Add Regressions
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract class </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">AssemblyDetailBase
    </span><span style="background:black none repeat scroll 0 0;color:white;">{
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">protected string </span><span style="background:black none repeat scroll 0 0;color:white;">_fullName;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">protected string </span><span style="background:black none repeat scroll 0 0;color:white;">_majorName;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string</span><span style="background:black none repeat scroll 0 0;color:white;">[] _nameSplit;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">protected string </span><span style="background:black none repeat scroll 0 0;color:white;">_pkey;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string </span><span style="background:black none repeat scroll 0 0;color:white;">_rawname;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">protected string</span><span style="background:black none repeat scroll 0 0;color:white;">[] _version;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">protected string </span><span style="background:black none repeat scroll 0 0;color:white;">_versionString;

        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Initializes a new instance of the </span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;see cref=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"AssemblyDetailBase"</span><span style="background:black none repeat scroll 0 0;color:gray;">/&gt; </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">class.
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"Current"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The current.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">protected </span><span style="background:black none repeat scroll 0 0;color:white;">AssemblyDetailBase(</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">Current)
        {
            ExtractParsedDetail(Current);
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract string </span><span style="background:black none repeat scroll 0 0;color:white;">FullName
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract string </span><span style="background:black none repeat scroll 0 0;color:white;">Version
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract int </span><span style="background:black none repeat scroll 0 0;color:white;">Major
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract int </span><span style="background:black none repeat scroll 0 0;color:white;">Minor
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract int </span><span style="background:black none repeat scroll 0 0;color:white;">Revision
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract int </span><span style="background:black none repeat scroll 0 0;color:white;">Build
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract string </span><span style="background:black none repeat scroll 0 0;color:white;">PublicKey
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract string </span><span style="background:black none repeat scroll 0 0;color:white;">MajorName
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }

        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">I do not want to persist the IAssemblyName
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">as it might introduce a COM reference when
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">we just can extract what we need and let it
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">pass away into whatever...
        </span><span style="background:black none repeat scroll 0 0;color:gray;">///
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Extracts the parsed detail.
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"Current"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The current.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">ExtractParsedDetail(</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">Current)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">const int </span><span style="background:black none repeat scroll 0 0;color:white;">stongKeyPosition = 3;
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">const int </span><span style="background:black none repeat scroll 0 0;color:white;">versionPosition = 1;

            </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">// Main Work Happens Here
            </span><span style="background:black none repeat scroll 0 0;color:white;">_fullName = GetDisplayName(Current);

            </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">// Simply parse the ", " that seperates the full
            // name
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">_parsedDetails = _fullName.Split(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">new</span><span style="background:black none repeat scroll 0 0;color:white;">[]
                                                 {
                                                         </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">", "
                                                 </span><span style="background:black none repeat scroll 0 0;color:white;">}, </span><span style="background:black none repeat scroll 0 0;color:#b8a223;">StringSplitOptions</span><span style="background:black none repeat scroll 0 0;color:white;">.RemoveEmptyEntries);

            ExtractVersionInfo(versionPosition, _parsedDetails);
            ExtractAddition(stongKeyPosition, _parsedDetails);
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">ExtractAddition(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">stongKeyPosition, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string</span><span style="background:black none repeat scroll 0 0;color:white;">[] parsedDetails)
        {
            _pkey = parsedDetails[stongKeyPosition];
            _rawname = parsedDetails[0].Trim();
            _nameSplit = _rawname.Split(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">'.'</span><span style="background:black none repeat scroll 0 0;color:white;">);
            _majorName = _nameSplit[0].Trim();
        }

        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Gets the display name from the unmanaged pointer
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"aName"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">A name.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">static string </span><span style="background:black none repeat scroll 0 0;color:white;">GetDisplayName(</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">aName)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">displayFlags = </span><span style="background:black none repeat scroll 0 0;color:#b8a223;">AssemblyNameDisplayFlags</span><span style="background:black none repeat scroll 0 0;color:white;">.ALL;

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">uiLen = 0;

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string </span><span style="background:black none repeat scroll 0 0;color:white;">_displayAssemblyName = </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">null</span><span style="background:black none repeat scroll 0 0;color:white;">;

            </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">// Get the length
            </span><span style="background:black none repeat scroll 0 0;color:white;">aName.GetDisplayName(</span><span style="background:black none repeat scroll 0 0;color:#76a38a;">IntPtr</span><span style="background:black none repeat scroll 0 0;color:white;">.Zero, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref </span><span style="background:black none repeat scroll 0 0;color:white;">uiLen, (</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint</span><span style="background:black none repeat scroll 0 0;color:white;">) displayFlags);

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">if </span><span style="background:black none repeat scroll 0 0;color:white;">(uiLen &gt; 0)
            {
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">byteBuffer = </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">new byte</span><span style="background:black none repeat scroll 0 0;color:white;">[(uiLen + 1)*2];
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">unsafe </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">//turn on sunsafe in project properties
                </span><span style="background:black none repeat scroll 0 0;color:white;">{
                    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">fixed </span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">byte</span><span style="background:black none repeat scroll 0 0;color:white;">* numRef1 = byteBuffer)
                    {
                        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">ptr1 = </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">new </span><span style="background:black none repeat scroll 0 0;color:#76a38a;">IntPtr</span><span style="background:black none repeat scroll 0 0;color:white;">(numRef1);
                        aName.GetDisplayName(ptr1, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref </span><span style="background:black none repeat scroll 0 0;color:white;">uiLen, (</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint</span><span style="background:black none repeat scroll 0 0;color:white;">) displayFlags);
                        _displayAssemblyName = </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Marshal</span><span style="background:black none repeat scroll 0 0;color:white;">.PtrToStringUni(ptr1);
                    }
                }
            }

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_displayAssemblyName;
        }

        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Extracts the version info.
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"versionPosition"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The version position.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"parsedDetails"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The parsed details.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">ExtractVersionInfo(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">versionPosition, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string</span><span style="background:black none repeat scroll 0 0;color:white;">[] parsedDetails)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">versionLiteral = parsedDetails[versionPosition];
            _versionString = ToCoreVersion(versionPosition, versionLiteral);
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">if </span><span style="background:black none repeat scroll 0 0;color:white;">(_versionString != </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String</span><span style="background:black none repeat scroll 0 0;color:white;">.Empty)
                _version = _versionString.Split(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">'.'</span><span style="background:black none repeat scroll 0 0;color:white;">);
        }

        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Gets the nice clean x.x.x.x string
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"versionPosition"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The version position.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"versionLiteral"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The version literal.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">static string </span><span style="background:black none repeat scroll 0 0;color:white;">ToCoreVersion(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">versionPosition, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string </span><span style="background:black none repeat scroll 0 0;color:white;">versionLiteral)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">returnVal = </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String</span><span style="background:black none repeat scroll 0 0;color:white;">.Empty;

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">if </span><span style="background:black none repeat scroll 0 0;color:white;">(!</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String</span><span style="background:black none repeat scroll 0 0;color:white;">.IsNullOrEmpty(versionLiteral))
            {
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">_indexOf = versionLiteral.IndexOf(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"="</span><span style="background:black none repeat scroll 0 0;color:white;">);

                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">if </span><span style="background:black none repeat scroll 0 0;color:white;">(_indexOf != -1)
                    returnVal = versionLiteral.Substring(_indexOf + versionPosition);
            }

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">returnVal;
        }
    }</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">#region

</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Runtime.InteropServices;

#endregion

</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">class </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">GAC
</span><span style="background:black none repeat scroll 0 0;color:white;">{
    GAC() {}

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">DllImport</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"Fusion.dll"</span><span style="background:black none repeat scroll 0 0;color:white;">, CharSet = </span><span style="background:black none repeat scroll 0 0;color:#b8a223;">CharSet</span><span style="background:black none repeat scroll 0 0;color:white;">.Auto)]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public static extern int </span><span style="background:black none repeat scroll 0 0;color:white;">CreateAssemblyEnum(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyEnum </span><span style="background:black none repeat scroll 0 0;color:white;">ppEnum,
                                                </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IApplicationContext </span><span style="background:black none repeat scroll 0 0;color:white;">pAppCtx,
                                                </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">pName, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">dwFlags,
                                                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">pvReserved);
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">#region

</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Runtime.InteropServices;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Security;

#endregion

[</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">SuppressUnmanagedCodeSecurity</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ComImport</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Guid</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"7C23FF90-33AF-11D3-95DA-00A024A85B51"</span><span style="background:black none repeat scroll 0 0;color:white;">),
 </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">InterfaceType</span><span style="background:black none repeat scroll 0 0;color:white;">(1)]
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public interface </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IApplicationContext
</span><span style="background:black none repeat scroll 0 0;color:white;">{
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">SetContextNameObject(</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">pName);

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">GetContextNameObject([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">ppName);

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">Set([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">MarshalAs</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#b8a223;">UnmanagedType</span><span style="background:black none repeat scroll 0 0;color:white;">.LPWStr)] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string </span><span style="background:black none repeat scroll 0 0;color:white;">szName, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">pvValue, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">cbValue,
             </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">dwFlags);

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">Get([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">MarshalAs</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#b8a223;">UnmanagedType</span><span style="background:black none repeat scroll 0 0;color:white;">.LPWStr)] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string </span><span style="background:black none repeat scroll 0 0;color:white;">szName, [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out int </span><span style="background:black none repeat scroll 0 0;color:white;">pvValue,
             </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref uint </span><span style="background:black none repeat scroll 0 0;color:white;">pcbValue, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">dwFlags);

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">GetDynamicDirectory([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out int </span><span style="background:black none repeat scroll 0 0;color:white;">wzDynamicDir, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref uint </span><span style="background:black none repeat scroll 0 0;color:white;">pdwSize);
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">#region

</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Runtime.InteropServices;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Security;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Text;

#endregion

</span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">IAssemblyName from Fusion
</span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
</span><span style="background:black none repeat scroll 0 0;color:white;">[</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">SuppressUnmanagedCodeSecurity</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ComImport</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Guid</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"CD193BC0-B4BC-11D2-9833-00C04FC31D2E"</span><span style="background:black none repeat scroll 0 0;color:white;">),
 </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">InterfaceType</span><span style="background:black none repeat scroll 0 0;color:white;">(1)]
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public interface </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName
</span><span style="background:black none repeat scroll 0 0;color:white;">{
    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">SetProperty(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">PropertyId, </span><span style="background:black none repeat scroll 0 0;color:#76a38a;">IntPtr </span><span style="background:black none repeat scroll 0 0;color:white;">pvProperty, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">cbProperty);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">GetProperty(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">PropertyId, </span><span style="background:black none repeat scroll 0 0;color:#76a38a;">IntPtr </span><span style="background:black none repeat scroll 0 0;color:white;">pvProperty, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref uint </span><span style="background:black none repeat scroll 0 0;color:white;">pcbProperty);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">Finalize();

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">GetDisplayName(</span><span style="background:black none repeat scroll 0 0;color:#76a38a;">IntPtr </span><span style="background:black none repeat scroll 0 0;color:white;">szDisplayName, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref uint </span><span style="background:black none repeat scroll 0 0;color:white;">pccDisplayName, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">dwDisplayFlags);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">BindToObject(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">object </span><span style="background:black none repeat scroll 0 0;color:white;">refIID, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">object </span><span style="background:black none repeat scroll 0 0;color:white;">pAsmBindSink,
                     </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IApplicationContext </span><span style="background:black none repeat scroll 0 0;color:white;">pApplicationContext,
                     [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">MarshalAs</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#b8a223;">UnmanagedType</span><span style="background:black none repeat scroll 0 0;color:white;">.LPWStr)] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string </span><span style="background:black none repeat scroll 0 0;color:white;">szCodeBase, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">long </span><span style="background:black none repeat scroll 0 0;color:white;">llFlags,
                     </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">pvReserved, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">cbReserved, [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out int </span><span style="background:black none repeat scroll 0 0;color:white;">ppv);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">GetName(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref uint </span><span style="background:black none repeat scroll 0 0;color:white;">lpcwBuffer,
                [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">MarshalAs</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#b8a223;">UnmanagedType</span><span style="background:black none repeat scroll 0 0;color:white;">.LPWStr)] </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">StringBuilder </span><span style="background:black none repeat scroll 0 0;color:white;">pwzName);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">GetVersion([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out uint </span><span style="background:black none repeat scroll 0 0;color:white;">pdwVersionHi, [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out uint </span><span style="background:black none repeat scroll 0 0;color:white;">pdwVersionLow);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">IsEqual(</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">pName, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">dwCmpFlags);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">Clone([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">pName);
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">#region

</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Runtime.InteropServices;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Security;

#endregion

[</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">SuppressUnmanagedCodeSecurity</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ComImport</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Guid</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"21B8916C-F28E-11D2-A473-00C04F8EF448"</span><span style="background:black none repeat scroll 0 0;color:white;">),
 </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">InterfaceType</span><span style="background:black none repeat scroll 0 0;color:white;">(1)]
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">interface </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyEnum
</span><span style="background:black none repeat scroll 0 0;color:white;">{
    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">GetNextAssembly([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IApplicationContext </span><span style="background:black none repeat scroll 0 0;color:white;">ppAppCtx,
                        [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">ppName, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">dwFlags);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">Reset();

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">Clone([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyEnum </span><span style="background:black none repeat scroll 0 0;color:white;">ppEnum);
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">#region

</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Collections;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Collections.Generic;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Runtime.InteropServices;

#endregion

</span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Fairly basic stuff once the
</span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">unmanaged stuff is all mapped
</span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public class </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">GacEnumerable </span><span style="background:black none repeat scroll 0 0;color:white;">: </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerator</span><span style="background:black none repeat scroll 0 0;color:white;">&lt;</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName</span><span style="background:black none repeat scroll 0 0;color:white;">&gt;, </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerable</span><span style="background:black none repeat scroll 0 0;color:white;">&lt;</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName</span><span style="background:black none repeat scroll 0 0;color:white;">&gt;
{
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">readonly </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyEnum </span><span style="background:black none repeat scroll 0 0;color:white;">_enumeration;
    </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">_enumCurrentAssembly;

    GacEnumerable()
    {
        HandleCom(</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">GAC</span><span style="background:black none repeat scroll 0 0;color:white;">.CreateAssemblyEnum(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:white;">_enumeration, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">null</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">null</span><span style="background:black none repeat scroll 0 0;color:white;">,
                                         (</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint</span><span style="background:black none repeat scroll 0 0;color:white;">) </span><span style="background:black none repeat scroll 0 0;color:#b8a223;">AssemblyCacheFlags</span><span style="background:black none repeat scroll 0 0;color:white;">.GAC, 0));
    }

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public static </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">GacEnumerable </span><span style="background:black none repeat scroll 0 0;color:white;">New
    {
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
        </span><span style="background:black none repeat scroll 0 0;color:white;">{
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return new </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">GacEnumerable</span><span style="background:black none repeat scroll 0 0;color:white;">();
        }
    }

    #region IEnumerable&lt;IAssemblyName&gt; Members

    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Returns an enumerator that iterates through the collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    /// &lt;returns&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">A </span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;see cref=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"T:System.Collections.Generic.IEnumerator`1"</span><span style="background:black none repeat scroll 0 0;color:gray;">/&gt; </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">that can be used to iterate through the collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/returns&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerator</span><span style="background:black none repeat scroll 0 0;color:white;">&lt;</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName</span><span style="background:black none repeat scroll 0 0;color:white;">&gt; GetEnumerator()
    {
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return this</span><span style="background:black none repeat scroll 0 0;color:white;">;
    }

    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Returns an enumerator that iterates through a collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    /// &lt;returns&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">An </span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;see cref=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"T:System.Collections.IEnumerator"</span><span style="background:black none repeat scroll 0 0;color:gray;">/&gt; </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">object that can be used to iterate through the collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/returns&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerator IEnumerable</span><span style="background:black none repeat scroll 0 0;color:white;">.GetEnumerator()
    {
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">GetEnumerator();
    }

    #endregion

    #region IEnumerator&lt;IAssemblyName&gt; Members

    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Advances the enumerator to the next element of the collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    /// &lt;returns&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/returns&gt;
    /// &lt;exception cref=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"T:System.InvalidOperationException"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The collection was modified after the enumerator was created. </span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/exception&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">bool </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerator</span><span style="background:black none repeat scroll 0 0;color:white;">.MoveNext()
    {
        </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IApplicationContext </span><span style="background:black none repeat scroll 0 0;color:white;">context1;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">(0 ==
                _enumeration.GetNextAssembly(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:white;">context1, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:white;">_enumCurrentAssembly, 0));
    }

    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Sets the enumerator to its initial position, which is before the first element in the collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    /// &lt;exception cref=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"T:System.InvalidOperationException"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The collection was modified after the enumerator was created. </span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/exception&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerator</span><span style="background:black none repeat scroll 0 0;color:white;">.Reset()
    {
        _enumeration.Reset();
    }

    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">IAssemblyName is a Fusion interface
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Gets the element in the collection at the current position of the enumerator.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    /// &lt;value&gt;&lt;/value&gt;
    /// &lt;returns&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The element in the collection at the current position of the enumerator.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/returns&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">Current
    {
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
        </span><span style="background:black none repeat scroll 0 0;color:white;">{
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_enumCurrentAssembly;
        }
    }
    </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">// Properties
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">object </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerator</span><span style="background:black none repeat scroll 0 0;color:white;">.Current
    {
        </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">// Go to the other darn Current not this one
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
        </span><span style="background:black none repeat scroll 0 0;color:white;">{
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">Current;
        }
    }
    </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">// Fields
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public void </span><span style="background:black none repeat scroll 0 0;color:white;">Dispose()
    {
        _enumCurrentAssembly = </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">null</span><span style="background:black none repeat scroll 0 0;color:white;">;
    }

    #endregion

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">internal static void </span><span style="background:black none repeat scroll 0 0;color:white;">HandleCom(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">hResult)
    {
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">if </span><span style="background:black none repeat scroll 0 0;color:white;">(hResult &lt; 0)
            </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Marshal</span><span style="background:black none repeat scroll 0 0;color:white;">.ThrowExceptionForHR(hResult);
    }
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><span style="font-size:x-small;"> </span></p>
<pre class="code"><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">[</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Flags</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">]
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">enum </span></span><span style="background:black none repeat scroll 0 0;color:#b8a223;"><span style="font-size:x-small;font-family:Consolas;">AssemblyCacheFlags
</span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;font-family:Consolas;">{
    NGenCache = 0x1,
    GAC = 0x2,
    DownloadCache = 0x4
}</span></span></pre>
<p><span style="font-size:x-small;"><br />
</span></p>
<pre class="code"><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">[</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Flags</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">]
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public enum </span></span><span style="background:black none repeat scroll 0 0;color:#b8a223;"><span style="font-size:x-small;font-family:Consolas;">AssemblyNameDisplayFlags
</span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;font-family:Consolas;">{
    VERSION = 0x01,
    CULTURE = 0x02,
    PUBLIC_KEY_TOKEN = 0x04,
    PROCESSORARCHITECTURE = 0x20,
    RETARGETABLE = 0x80,
    ALL = VERSION |
        CULTURE | PROCESSORARCHITECTURE |
        PUBLIC_KEY_TOKEN | RETARGETABLE
}</span></span></pre>
<h2>More to Come</h2>
<p>This is the tip of the iceberg so to speak. Here is a test case to show you what this now is doing and perhaps you can give us ideas where to take it. There is a lot of code. Should it be up on CodePlex? Google Code?  Your Environment Variables:</p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">    <span style="font-size:x-small;font-family:Consolas;">   [</span></span><span style="background:black none repeat scroll 0 0;color:#2b91af;"><span style="font-size:x-small;font-family:Consolas;">Fact</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">]
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public void </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">should_show_my_env()
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">sw = </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Stopwatch</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">.StartNew();
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">dirs = </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">from </span><span style="background:black none repeat scroll 0 0;color:white;">env </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ThisBox</span><span style="background:black none repeat scroll 0 0;color:white;">.By&lt;</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">EnvironmentVariable</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">&gt;()
                       </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">select </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">env;
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">foreach </span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">s </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">dirs)
            {
                </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(s.TypeOfEnv + </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">" " </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">+ s.KeyName);
                </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"  ==&gt;" </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">+ s.Value);
            }
            </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"Count : " </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">+ dirs.Count());
            </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"Search Took : " </span><span style="background:black none repeat scroll 0 0;color:white;">+ sw.ElapsedMilliseconds + </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">" ms"</span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;font-family:Consolas;">);
            sw.Stop();
        }</span></span></pre>
<p><span style="font-size:x-small;font-family:Consolas;">Let’s join our GAC with our registry!</span></p>
<p><span style="font-size:x-small;font-family:Consolas;">NOTE: we get 592 hits in 20 or so seconds… </span></p>
<pre class="code"><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">        [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Fact</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">]
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public void </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">should_join_policy_registry_section()
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">sw = </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Stopwatch</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">.StartNew();

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">result = </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:#ecc03e;">from
                             </span><span style="background:black none repeat scroll 0 0;color:white;">gac </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ThisBox</span><span style="background:black none repeat scroll 0 0;color:white;">.By&lt;</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">AssemblyDetail</span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;font-family:Consolas;">&gt;()
                         </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:#ecc03e;">join
                             </span><span style="background:black none repeat scroll 0 0;color:white;">registryKey </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ThisBox</span><span style="background:black none repeat scroll 0 0;color:white;">.By&lt;</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">RegistryKey</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">&gt;() 

                         </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">on </span><span style="background:black none repeat scroll 0 0;color:white;">gac.MajorName </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">equals </span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;font-family:Consolas;">registryKey.FirstRegValue()

                         </span></span><span style="background:black none repeat scroll 0 0;color:#ecc03e;"><span style="font-size:x-small;font-family:Consolas;">select new
                                </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">{
                                        gac, RegVal=registryKey.FirstRegValue()
                                };

            </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"Count : " </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">+ result.Count());
            sw.Stop();
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">foreach </span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">a </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">result)
            {
                </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(a.gac.MajorName + </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">" == " </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">+ a.RegVal);
                </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">" ==&gt;" </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">+ a.gac.FullName);
            }

            </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"Search Took : " </span><span style="background:black none repeat scroll 0 0;color:white;">+ sw.ElapsedMilliseconds + </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">" ms"</span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;font-family:Consolas;">);
        }</span>
</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<h2>Appendix : A Few Extension Methods we Use<span style="background:black none repeat scroll 0 0;color:white;"> </span></h2>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">  </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">static class </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">LinqProviderTestExtensions
    </span><span style="background:black none repeat scroll 0 0;color:white;">{
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Will perform each action for each
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">'row' in the included collection
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Each 'row' is of Type TTreeNode
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Will typically only be one action
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
        /// &lt;typeparam name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"T"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;&lt;/typeparam&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"items"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;&lt;/param&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"actions"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;&lt;/param&gt;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">static internal void </span><span style="background:black none repeat scroll 0 0;color:white;">ForEach&lt;T&gt;(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">this </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerable</span><span style="background:black none repeat scroll 0 0;color:white;">&lt;T&gt; items, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">params </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Action</span><span style="background:black none repeat scroll 0 0;color:white;">&lt;T&gt;[] actions)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">foreach </span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">t </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span><span style="background:black none repeat scroll 0 0;color:white;">items)
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">foreach </span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">act </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span><span style="background:black none repeat scroll 0 0;color:white;">actions)
                    act.Invoke(t);
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public static string </span><span style="background:black none repeat scroll 0 0;color:white;">FirstRegValue(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">this </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">RegistryKey </span><span style="background:black none repeat scroll 0 0;color:white;">registryKey)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">registryKey.ValueCount &gt; 0
                           ? (</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string</span><span style="background:black none repeat scroll 0 0;color:white;">) registryKey.GetValueNames().GetValue(0) : </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String</span><span style="background:black none repeat scroll 0 0;color:white;">.Empty;
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public static double </span><span style="background:black none repeat scroll 0 0;color:white;">ToPercent(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">this int </span><span style="background:black none repeat scroll 0 0;color:white;">target, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">total)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">target.ToPercent((</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">double</span><span style="background:black none repeat scroll 0 0;color:white;">) total);
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public static </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String </span><span style="background:black none repeat scroll 0 0;color:white;">ToPctString(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">this int </span><span style="background:black none repeat scroll 0 0;color:white;">target, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">total)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">target.ToPercent((</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">double</span><span style="background:black none repeat scroll 0 0;color:white;">) total) + </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"%"</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public static double </span><span style="background:black none repeat scroll 0 0;color:white;">ToPercent(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">this int </span><span style="background:black none repeat scroll 0 0;color:white;">target, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">double </span><span style="background:black none repeat scroll 0 0;color:white;">total)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Math</span><span style="background:black none repeat scroll 0 0;color:white;">.Round((target/total)*100, 2);
        }
    }</span></pre>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">A huge Thanks:</span></pre>
<pre class="code"><a title="http://dotnetjunkies.com/WebLog/debasish/" href="http://dotnetjunkies.com/WebLog/debasish/" target="_blank">Debasish Bose</a></pre>
<pre class="code">
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:4996f79e-bdd5-4823-85e8-11fd4c706280" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">del.icio.us Tags: <a rel="tag" href="http://del.icio.us/popular/Advanced+C%23">Advanced C#</a>,<a rel="tag" href="http://del.icio.us/popular/C%23+Unmanaged+Wrapper">C# Unmanaged Wrapper</a>,<a rel="tag" href="http://del.icio.us/popular/Fusion">Fusion</a>,<a rel="tag" href="http://del.icio.us/popular/GAC">GAC</a>,<a rel="tag" href="http://del.icio.us/popular/Global+Assembly+Cache">Global Assembly Cache</a>,<a rel="tag" href="http://del.icio.us/popular/IEnumerable">IEnumerable</a>,<a rel="tag" href="http://del.icio.us/popular/IEnumerator">IEnumerator</a>,<a rel="tag" href="http://del.icio.us/popular/Internals">Internals</a>,<a rel="tag" href="http://del.icio.us/popular/Lambada">Lambada</a>,<a rel="tag" href="http://del.icio.us/popular/Linq+to+Gac">Linq to Gac</a>,<a rel="tag" href="http://del.icio.us/popular/Linq+to+Objects">Linq to Objects</a>,<a rel="tag" href="http://del.icio.us/popular/Machine">Machine</a>,<a rel="tag" href="http://del.icio.us/popular/Registry">Registry</a></div>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d890b055-0d6b-4680-a4e0-6f7fb6c20546" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">Technorati Tags: <a rel="tag" href="http://technorati.com/tags/Advanced+C%23">Advanced C#</a>,<a rel="tag" href="http://technorati.com/tags/C%23+Unmanaged+Wrapper">C# Unmanaged Wrapper</a>,<a rel="tag" href="http://technorati.com/tags/Fusion">Fusion</a>,<a rel="tag" href="http://technorati.com/tags/GAC">GAC</a>,<a rel="tag" href="http://technorati.com/tags/Global+Assembly+Cache">Global Assembly Cache</a>,<a rel="tag" href="http://technorati.com/tags/IEnumerable">IEnumerable</a>,<a rel="tag" href="http://technorati.com/tags/IEnumerator">IEnumerator</a>,<a rel="tag" href="http://technorati.com/tags/Internals">Internals</a>,<a rel="tag" href="http://technorati.com/tags/Lambada">Lambada</a>,<a rel="tag" href="http://technorati.com/tags/Linq+to+Gac">Linq to Gac</a>,<a rel="tag" href="http://technorati.com/tags/Linq+to+Objects">Linq to Objects</a>,<a rel="tag" href="http://technorati.com/tags/Machine">Machine</a>,<a rel="tag" href="http://technorati.com/tags/Registry">Registry</a></div>
</pre>
<h3>Related Posts</h3>
<div class="wlw_related_posts">from tag <a href="http://del.icio.us/damoncarr/Fusion">Fusion</a></p>
<ul>
<li><a href="http://blog.domaindotnet.com/2008/09/20/fusion_c_sharp_wrapper_for_linq_to_gac_access/">Linq to Gac : Use Linq to Power Query your Gac via this C# Bridge to Fusion « team domain.dot.net</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/Lambada">Lambada</a></p>
<ul>
<li><a href="http://blog.domaindotnet.com/2008/07/24/linq-c-30-enumerable-extension-method-reference/">Linq C# 3.0 Enumerable Extension Method Reference « don’t give up on software just yet</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/Linq">Linq</a></p>
<ul>
<li><a href="http://www.istartedsomething.com/20061029/royale-noir/">Royale Noir: secret XP theme uncovered (download) &#8211; istartedsomething</a></li>
<li><a href="/cifs/opt">linux</a></li>
<li><a href="http://www.google.co.uk/search?hl=en&amp;ie=UTF-8&amp;q=%s&amp;meta=cr%3DcountryUK%7CcountryGB">guk</a></li>
<li><a href="http://msdn2.microsoft.com/en-us/library/ms345135.aspx">Managed Data Access Inside SQL Server with ADO.NET and SQLCLR</a></li>
<li><a href="http://damon.agilefactor.com/feed">where(dev=&gt; Is.Broken(dev)).tryinject(commonsense)</a></li>
<li><a href="http://www.daveandal.net/articles/esbdocs/">Microsoft ESB Guidance (August 2007 CTP Release)</a></li>
<li><a href="http://pinguy.infogami.com/blog/210ee">What to Install After a Fresh XP Install (PinGUY&#8217;s Website)</a></li>
<li><a href="http://evanhoff.com/archive/2007/07/23/39.aspx">NHibernate SysCache Issues &#8211; Solved</a></li>
<li><a href="http://nightweed.com/printableusavotefacts.html">20 Amazing Facts About  Voting in the USA</a></li>
<li><a href="http://cdimage.ubuntu.com/kubuntu-kde4/releases/8.04/release/kubuntu-kde4-8.04.1-desktop-i386.iso">http://cdimage.ubuntu.com/kubuntu-kde4/releases/8.04/release/kubuntu-kde4-8.04.1-desktop-i386.iso</a></li>
<li><a href="http://feeds.feedburner.com/adaptiveblue/feed">BlueBlog</a></li>
<li><a href="http://damoncarr.freepolls.com/cgi-bin/util/site_admin">free Web polls</a></li>
<li><a href="http://code.google.com/">Developer Home &#8211; Google Code</a></li>
<li><a href="http://www.xmllab.net/mvpxml/">Mvp.Xml Library Documentation &#8211; Mvp.Xml.Common Namespace</a></li>
<li><a href="http://www.codeplex.com/esb">patterns &amp; practices Enterprise Service Bus Guidance &#8211; Home</a></li>
<li><a href="http://www.ifcfilms.com/">IFC Entertainment</a></li>
<li><a href="http://www.buildinglink.com/default.asp">BuildingLink</a></li>
<li><a href="http://msdn.microsoft.com/msdnmag/issues/07/02/SQLRegex/default.aspx">SQL Server 2005 Regular Expressions Make Pattern Matching</a></li>
</ul>
<p><a href="http://del.icio.us/damoncarr/Linq">(more..)</a></p>
</div>
<div class="wlWriterHeaderFooter" style="text-align:left;margin:0;padding:4px 0;"><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2008%2f09%2f20%2ffusion_c_sharp_wrapper_for_linq_to_gac_access%2f&amp;title=Linq+to+Gac+%3a+Use+Linq+to+Power+Query+your+Gac+via+this+C%23+Bridge+to+Fusion"><img style="border:0;" title="Digg This" src="http://digg.com/img/badges/100x20-digg-button.png" border="0" alt="Digg This" width="100" height="20" /></a></div>
<br />Posted in C# 3.0 Enhancements, C# 3.0 for Internal DSL, concepts implemented, Framework Design, Generics, Proof Driven Development, Software Design, Software Futures, Technology Tagged: CSharp, DomainDriven, Fusion, GAC, Global Assembly Cache, IEnumerable, IEnumerator, Internals, Lambada, Linq, Linq to Gac, Linq to Objects, Machine, Registry <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/928/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/928/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/928/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/928/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/928/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=928&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/09/20/fusion_c_sharp_wrapper_for_linq_to_gac_access/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<georss:point>30.196311 -97.730807</georss:point>
		<geo:lat>30.196311</geo:lat>
		<geo:long>-97.730807</geo:long>
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.domaindotnet.com%2f2008%2f09%2f20%2ffusion_c_sharp_wrapper_for_linq_to_gac_access%2f" medium="image">
			<media:title type="html">kick it on DotNetKicks.com</media:title>
		</media:content>

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/09/classdiagram2-thumb1.png" medium="image">
			<media:title type="html">ClassDiagram2</media:title>
		</media:content>

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>
	</item>
		<item>
		<title>Expose New Linq Operations from the Screaming HashSet&lt;T&gt; Collection</title>
		<link>http://team.pushbomb.com/2008/09/08/the_fastest_dot_net_hash_set_collection_with_linq_extended_features/</link>
		<comments>http://team.pushbomb.com/2008/09/08/the_fastest_dot_net_hash_set_collection_with_linq_extended_features/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 01:36:20 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[concepts implemented]]></category>
		<category><![CDATA[nhibernate]]></category>
		<category><![CDATA[.NET 3.5]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[HashSet]]></category>
		<category><![CDATA[Linq]]></category>
		<category><![CDATA[Linq to NHibernate]]></category>
		<category><![CDATA[Linq Undocumented]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/09/08/the_fastest_dot_net_hash_set_collection_with_linq_extended_features/</guid>
		<description><![CDATA[Linq is not just about databases. It’s about reading the registry, your hard-disk, or even a list of function pointers to be invoked. Linq is about more event then sets (collections). It’s about making tasks easier in many cases and vastly more powerful (and most importantly your code more readable and maintainable at the same time).<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=874&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>&#160;</p>
<p><a target="_blank" href="http://en.wikipedia.org/wiki/Language_Integrated_Query">Linq</a> is not just about databases. It’s about reading the registry, your hard-disk, or even a list of function pointers to be invoked. Linq is about more even then sets (collections). It’s about making tasks easier in many cases and vastly more powerful (and most importantly your code more readable and maintainable at the same time).     <br /><a href="http://dcarr.files.wordpress.com/2008/09/premature-6.jpg"><img style="border-width:0;margin:0 0 15px 20px;" title="premature_optimization" border="0" alt="premature_optimization" align="right" src="http://dcarr.files.wordpress.com/2008/09/premature-6-thumb.jpg?w=244&#038;h=181" width="244" height="181" /></a></p>
<blockquote><h3>It’s astounding just how fast the <a target="_blank" href="http://msdn.microsoft.com/en-us/library/bb397727.aspx">HashSet&lt;T&gt;</a> collection is.</h3>
</blockquote>
<p>This post will show how to gain additional power that is fully supported from Microsoft which is often overlooked, yet it can solve some of the hardest problems (especially around performance however don’t prematurely optimize!).</p>
<p>&#160; <br />There are tons of cases where we need a real powerhouse to manage super-large sets (in this example we will use the registry). An entire part of the registry actually. </p>
<p>Here is the API we want to use to query the HKLM part of our registry:</p>
<pre class="code"><span style="background:black;color:white;">            </span><span style="background:black;color:#ecc03e;">var </span><span style="background:black;color:white;">FindFontsColors = </span><span style="background:black;color:#ecc03e;">from </span><span style="background:black;color:white;">rk </span><span style="background:black;color:#ecc03e;">in </span><span style="background:black;color:#2b91af;">RegistryServer</span><span style="background:black;color:white;">.Hklm
                                  </span><span style="background:black;color:#ecc03e;">where
                                          </span><span style="background:black;color:white;">rk.Name.Contains(</span><span style="background:black;color:#ecc03e;">&quot;VisualStudio&quot;</span><span style="background:black;color:white;">) &amp;&amp;
                                          rk.Name.EndsWith(</span><span style="background:black;color:#ecc03e;">&quot;FontsAndColors&quot;</span><span style="background:black;color:white;">) &amp;&amp;
                                          rk.ValueCount &gt; 0

                                  </span><span style="background:black;color:#ecc03e;">select </span><span style="background:black;color:white;">rk.Name;

</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<ul>
  </ul>
<ul>
<li>
<div align="left">The core win here is &#8216;ease of development and maintenance’ without the typical trade-off<br />
        <br />in performance. The entire equation is shifted actually so the tradeoff becomes irrelevant. </div>
</li>
<li>
<div align="left">Sure you could do this with a lot more code perhaps even a few ms faster. But at what real cost over the life of your code?</div>
</li>
<li>
<div align="left">The entire point of this post is the far greater win in maintenance and ease of understanding, without the assumed loss of things like performance.</div>
</li>
</ul>
<p>&#160;</p>
<p>When there is no intelligence available on a ‘back-end’ to parse your requests, yet you need the power of finding complex conditional results and much more, there is one recently introduced superstar that is often not described in terms of Linq:</p>
<h2>HashSet&lt;T&gt;</h2>
<p>Let’s start with some code. You know you can call ToList, ToArray, ToDictionary &amp; ToLookup on your collections (we’ll call them Sequences to stay in line with Linq terms).</p>
<ul>
<li>
<div align="right">You will see ‘sets’, ‘collections’ &amp; sequences used together in documentation today. The differences are mostly academic, however the HashSet does illustrate some of those semantic differences which we point out.</div>
</li>
</ul>
<p>We are going to add an extension method to provide us a ToHashSet capability off any IEnumerable&lt;T&gt; (in exactly the same implementation style Microsoft used internally).</p>
<p>Here is how we gain access to this type in the easiest way:</p>
<pre class="code"><span style="background:black;color:white;">    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System.Collections.Generic;

    </span><span style="background:black;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black;color:#9ff5fd;">This extension method class will add a ToHashSet</span><span style="background:black;color:gray;">&lt;typeparamref name=</span><span style="background:black;color:#9feca5;">&quot;&gt;&quot;</span><span style="background:black;color:gray;">/&gt;
    /// </span><span style="background:black;color:#9ff5fd;">in exactly the same way it is provided by the others:
    </span><span style="background:black;color:gray;">///
    /// </span><span style="background:black;color:#9ff5fd;">ToList(), ToArray(), ToDictionary().. Now ToHashSet() is available
    </span><span style="background:black;color:gray;">/// &lt;/summary&gt;
    </span><span style="background:black;color:#ecc03e;">public static class </span><span style="background:black;color:#2b91af;">HashSetLinqAccess
    </span><span style="background:black;color:white;">{
        </span><span style="background:black;color:#ecc03e;">public static </span><span style="background:black;color:#2b91af;">HashSet</span><span style="background:black;color:white;">&lt;T&gt; ToHashSet&lt;T&gt;(</span><span style="background:black;color:#ecc03e;">this </span><span style="background:black;color:#9185fa;">IEnumerable</span><span style="background:black;color:white;">&lt;T&gt; fromEnumerable,
            </span><span style="background:black;color:#9185fa;">IEqualityComparer</span><span style="background:black;color:white;">&lt;T&gt; comparer)
        {
            </span><span style="background:black;color:#ecc03e;">if </span><span style="background:black;color:white;">(fromEnumerable == </span><span style="background:black;color:#ecc03e;">null</span><span style="background:black;color:white;">)
                </span><span style="background:black;color:#ecc03e;">throw new </span><span style="background:black;color:#2b91af;">ArgumentNullException</span><span style="background:black;color:white;">(</span><span style="background:black;color:#ecc03e;">&quot;fromEnumerable&quot;</span><span style="background:black;color:white;">);

            </span><span style="background:black;color:#ecc03e;">if </span><span style="background:black;color:white;">(comparer == </span><span style="background:black;color:#ecc03e;">null</span><span style="background:black;color:white;">)
                comparer = </span><span style="background:black;color:#2b91af;">EqualityComparer</span><span style="background:black;color:white;">&lt;T&gt;.Default;

            </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">!</span><span style="background:black;color:#ecc03e;">typeof</span><span style="background:black;color:white;">(</span><span style="background:black;color:#2b91af;">HashSet</span><span style="background:black;color:white;">&lt;T&gt;).IsAssignableFrom(fromEnumerable.GetType())
                           ? </span><span style="background:black;color:#ecc03e;">new </span><span style="background:black;color:#2b91af;">HashSet</span><span style="background:black;color:white;">&lt;T&gt;(fromEnumerable, comparer)
                           : (</span><span style="background:black;color:#2b91af;">HashSet</span><span style="background:black;color:white;">&lt;T&gt;)fromEnumerable;
        }

        </span><span style="background:black;color:#ecc03e;">public static </span><span style="background:black;color:#2b91af;">HashSet</span><span style="background:black;color:white;">&lt;T&gt; ToHashSet&lt;T&gt;(</span><span style="background:black;color:#ecc03e;">this </span><span style="background:black;color:#9185fa;">IEnumerable</span><span style="background:black;color:white;">&lt;T&gt; fromEnumerable) {

            </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">ToHashSet(fromEnumerable, </span><span style="background:black;color:#2b91af;">EqualityComparer</span><span style="background:black;color:white;">&lt;T&gt;.Default);
        }
    }</span></pre>
<p>Ok so what are we going to do with the HashSet&lt;T&gt; and why?</p>
<p>The benefit comes when we have in-memory large sequences to deal with. I will be using the following code as the ‘server’ here. This is code that provides a ‘Registry Server’ to our application. We will populate up a HashSet&lt;T&gt; with RegistryKey instances and then see just how fast it is.</p>
<p>In the next post we will cover all of the additional methods the HashSet&lt;T&gt; exposes. </p>
<p>Here is the code for our Registry Server. NOTE: Please do not try to modify this to change your registry unless you know what you are doing. This is an immutable (read-only) projection from the registry for a very good reason: You can thrash your machine otherwise.</p>
<p>&#160;</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<pre class="code"><span style="background:black;color:#ecc03e;">namespace </span><span style="background:black;color:white;">domaindotnet.LinqToRegistry {
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System.Collections;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System.Collections.Generic;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System.Linq;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System.Runtime.CompilerServices;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System.Threading;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">Castle.Core;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">LinqToCore;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">Microsoft.Win32;

    </span><span style="background:black;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black;color:#9ff5fd;">Provider immutable projections from the registry
    </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">of the machine, as well as events for status and errors
    </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">via a singeton wrapper on the .NET Registry
    </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">singleton.
    </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">Here we are only exposing the HKLM area
    </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">subkey but you can see it is easily extensible
    </span><span style="background:black;color:gray;">/// &lt;/summary&gt;
    </span><span style="background:black;color:#ecc03e;">public class </span><span style="background:black;color:#2b91af;">RegistryServer </span><span style="background:black;color:white;">: </span><span style="background:black;color:#9185fa;">IEqualityComparer</span><span style="background:black;color:white;">&lt;</span><span style="background:black;color:#2b91af;">RegistryKey</span><span style="background:black;color:white;">&gt;, </span><span style="background:black;color:#9185fa;">IInitializable</span><span style="background:black;color:white;">,
                                  </span><span style="background:black;color:#9185fa;">IEnumerable</span><span style="background:black;color:white;">&lt;</span><span style="background:black;color:#2b91af;">RegistryKey</span><span style="background:black;color:white;">&gt; {
        </span><span style="background:black;color:#f5f01f;">// IInitializable is from Castle.Core Contractually
        // saying we need a call on our Initialize() method
        // before we can be given out as a service to
        // others

        </span><span style="background:black;color:#ecc03e;">private static readonly </span><span style="background:black;color:#2b91af;">RegistryServer </span><span style="background:black;color:white;">_instance;
        </span><span style="background:black;color:#ecc03e;">private static int </span><span style="background:black;color:white;">iCounter;
        </span><span style="background:black;color:#ecc03e;">private </span><span style="background:black;color:#2b91af;">HashSet</span><span style="background:black;color:white;">&lt;</span><span style="background:black;color:#2b91af;">RegistryKey</span><span style="background:black;color:white;">&gt; allKeys;
        </span><span style="background:black;color:#ecc03e;">private </span><span style="background:black;color:#2b91af;">PopulateProgressEventArgs </span><span style="background:black;color:white;">eventArgStatus;
        </span><span style="background:black;color:#ecc03e;">private bool </span><span style="background:black;color:white;">isInitialized;
</span></pre>
<pre class="code"><span style="background:black;color:white;">        </span><span style="background:black;color:#ecc03e;">private </span><span style="background:black;color:#2b91af;">PopulateProgressDelegateError </span><span style="background:black;color:white;">populateError = </span><span style="background:black;color:#ecc03e;">delegate </span><span style="background:black;color:white;">{ };
        </span><span style="background:black;color:#ecc03e;">private </span><span style="background:black;color:#2b91af;">PopulateProgressDelegate </span><span style="background:black;color:white;">populateEventOk = </span><span style="background:black;color:#ecc03e;">delegate </span><span style="background:black;color:white;">{ };</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black;color:white;">
        </span><span style="background:black;color:#ecc03e;">static </span><span style="background:black;color:white;">RegistryServer() {
          </span></pre>
<pre class="code"><span style="background:black;color:white;">            _instance = </span><span style="background:black;color:#ecc03e;">new </span><span style="background:black;color:#2b91af;">RegistryServer
            </span><span style="background:black;color:white;">{eventArgStatus = </span><span style="background:black;color:#ecc03e;">new </span><span style="background:black;color:#2b91af;">PopulateProgressEventArgs</span><span style="background:black;color:white;">()};</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black;color:white;"></span><span style="background:black;color:white;">        }

        </span><span style="background:black;color:#ecc03e;">private </span><span style="background:black;color:white;">RegistryServer() {}

        </span><span style="background:black;color:#ecc03e;">public static long </span><span style="background:black;color:white;">Count {
            </span><span style="background:black;color:#ecc03e;">get </span><span style="background:black;color:white;">{
                </span><span style="background:black;color:#ecc03e;">if </span><span style="background:black;color:white;">(!_instance.isInitialized)
                    </span><span style="background:black;color:#ecc03e;">throw new </span><span style="background:black;color:#2b91af;">InvalidOperationException</span><span style="background:black;color:white;">(
                            </span><span style="background:black;color:#ecc03e;">&quot;Please initialize the backing store first&quot;</span><span style="background:black;color:white;">);

                </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">_instance.allKeys.Count;
            }
        }

        </span><span style="background:black;color:#ecc03e;">public static </span><span style="background:black;color:#2b91af;">RegistryServer </span><span style="background:black;color:white;">Hklm {
            </span><span style="background:black;color:#ecc03e;">get </span><span style="background:black;color:white;">{
                </span><span style="background:black;color:#ecc03e;">if </span><span style="background:black;color:white;">(!_instance.isInitialized)
                    </span><span style="background:black;color:#ecc03e;">throw new </span><span style="background:black;color:#2b91af;">InvalidOperationException</span><span style="background:black;color:white;">(
                            </span><span style="background:black;color:#ecc03e;">&quot;Please initialize the backing store first&quot;</span><span style="background:black;color:white;">);

                </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">_instance;
            }
        }

        #region IEnumerable&lt;RegistryKey&gt; Members

        </span><span style="background:black;color:#ecc03e;">public </span><span style="background:black;color:#9185fa;">IEnumerator</span><span style="background:black;color:white;">&lt;</span><span style="background:black;color:#2b91af;">RegistryKey</span><span style="background:black;color:white;">&gt; GetEnumerator() {
            </span><span style="background:black;color:#ecc03e;">if </span><span style="background:black;color:white;">(!isInitialized)
                </span><span style="background:black;color:#ecc03e;">throw new </span><span style="background:black;color:#2b91af;">InvalidOperationException</span><span style="background:black;color:white;">(
                        </span><span style="background:black;color:#ecc03e;">&quot;Please initialize the backing store first&quot;</span><span style="background:black;color:white;">);

            </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">allKeys.GetEnumerator();
        }

        </span><span style="background:black;color:#9185fa;">IEnumerator IEnumerable</span><span style="background:black;color:white;">.GetEnumerator() {
            </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">GetEnumerator();
        }

        #endregion

        #region IEqualityComparer&lt;RegistryKey&gt; Members

        </span><span style="background:black;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black;color:#9ff5fd;">If either contains a null, the result is false (actually it is
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">null be we do not have that option. It is 'unknown and indeterminant'.
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">An emptry string however is treated as 'known to be empty'
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">where null is 'could be anything we have no idea'.
        </span><span style="background:black;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black;color:#9feca5;">&quot;x&quot;</span><span style="background:black;color:gray;">&gt;&lt;/param&gt;
        /// &lt;param name=</span><span style="background:black;color:#9feca5;">&quot;y&quot;</span><span style="background:black;color:gray;">&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        </span><span style="background:black;color:#ecc03e;">public bool </span><span style="background:black;color:white;">Equals(</span><span style="background:black;color:#2b91af;">RegistryKey </span><span style="background:black;color:white;">x, </span><span style="background:black;color:#2b91af;">RegistryKey </span><span style="background:black;color:white;">y) {
            </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">x.Name != </span><span style="background:black;color:#ecc03e;">null </span><span style="background:black;color:white;">&amp;&amp; y.Name != </span><span style="background:black;color:#ecc03e;">null </span><span style="background:black;color:white;">&amp;&amp; x.Name == y.Name;
        }

        </span><span style="background:black;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black;color:#9ff5fd;">For null names here we will calculate a funky random number
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">as null != null
        </span><span style="background:black;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black;color:#9feca5;">&quot;obj&quot;</span><span style="background:black;color:gray;">&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        </span><span style="background:black;color:#ecc03e;">public int </span><span style="background:black;color:white;">GetHashCode(</span><span style="background:black;color:#2b91af;">RegistryKey </span><span style="background:black;color:white;">obj) {
            </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">obj.Name != </span><span style="background:black;color:#ecc03e;">null
                           </span><span style="background:black;color:white;">? obj.Name.GetHashCode()
                           : </span><span style="background:black;color:#2b91af;">RuntimeHelpers</span><span style="background:black;color:white;">.GetHashCode(</span><span style="background:black;color:#ecc03e;">new object</span><span style="background:black;color:white;">());
        }

        #endregion

        #region IInitializable Members

        </span><span style="background:black;color:#ecc03e;">void </span><span style="background:black;color:#9185fa;">IInitializable</span><span style="background:black;color:white;">.Initialize() {
            Initialize();
        }

        #endregion

        </span><span style="background:black;color:#ecc03e;">public static event </span><span style="background:black;color:#2b91af;">PopulateProgressDelegate </span><span style="background:black;color:white;">PopulateProgress {
            </span><span style="background:black;color:#ecc03e;">add </span><span style="background:black;color:white;">{ _instance.populateEventOk += </span><span style="background:black;color:#ecc03e;">value</span><span style="background:black;color:white;">; }
            </span><span style="background:black;color:#ecc03e;">remove </span><span style="background:black;color:white;">{ _instance.populateEventOk -= </span><span style="background:black;color:#ecc03e;">value</span><span style="background:black;color:white;">; }
        }

        </span><span style="background:black;color:#ecc03e;">private void </span><span style="background:black;color:white;">InvokePopulateProgress() {
            </span><span style="background:black;color:#ecc03e;">var </span><span style="background:black;color:white;">PopulateProgressDelegate = _instance.populateEventOk;
</span><span style="background:black;color:white;">                eventArgStatus.ItemCount = </span><span style="background:black;color:#2b91af;">Interlocked</span><span style="background:black;color:white;">.Increment(</span><span style="background:black;color:#ecc03e;">ref </span><span style="background:black;color:white;">iCounter);
                PopulateProgressDelegate(</span><span style="background:black;color:#ecc03e;">this</span><span style="background:black;color:white;">, eventArgStatus);

        }

        </span><span style="background:black;color:#ecc03e;">public static event </span><span style="background:black;color:#2b91af;">PopulateProgressDelegateError </span><span style="background:black;color:white;">PopulateProgressItemError {
            </span><span style="background:black;color:#ecc03e;">add </span><span style="background:black;color:white;">{ _instance.populateError += </span><span style="background:black;color:#ecc03e;">value</span><span style="background:black;color:white;">; }
            </span><span style="background:black;color:#ecc03e;">remove </span><span style="background:black;color:white;">{ _instance.populateError -= </span><span style="background:black;color:#ecc03e;">value</span><span style="background:black;color:white;">; }
        }

        </span><span style="background:black;color:#ecc03e;">private static void </span><span style="background:black;color:white;">InvokePopulateProgressItemError(</span><span style="background:black;color:#2b91af;">PopulateProgressEventArgs </span><span style="background:black;color:white;">args) {
         </span><span style="background:black;color:white;">  _instance.populateError(_instance, args);
        }

        </span><span style="background:black;color:#ecc03e;">public static void </span><span style="background:black;color:white;">Initialize() {
            Initialize(</span><span style="background:black;color:#2b91af;">Registry</span><span style="background:black;color:white;">.LocalMachine);
        }

        </span><span style="background:black;color:#ecc03e;">private static void </span><span style="background:black;color:white;">Initialize(</span><span style="background:black;color:#2b91af;">RegistryKey </span><span style="background:black;color:white;">RegistryStartKey) {
            </span><span style="background:black;color:#ecc03e;">if </span><span style="background:black;color:white;">(_instance.isInitialized)
                </span><span style="background:black;color:#ecc03e;">throw new </span><span style="background:black;color:#2b91af;">InvalidOperationException</span><span style="background:black;color:white;">(
                        </span><span style="background:black;color:#ecc03e;">&quot;Already Initialized. Cannot perform twice&quot;</span><span style="background:black;color:white;">);

          </span><span style="background:black;color:white;">
            _instance.allKeys = GetAllSubkeys(RegistryStartKey, </span><span style="background:black;color:#ecc03e;">&quot;&quot;</span><span style="background:black;color:white;">).ToHashSet(_instance);

            _instance.isInitialized = </span><span style="background:black;color:#ecc03e;">true</span><span style="background:black;color:white;">;
        }

        </span><span style="background:black;color:#ecc03e;">private static </span><span style="background:black;color:#9185fa;">IEnumerable</span><span style="background:black;color:white;">&lt;</span><span style="background:black;color:#2b91af;">RegistryKey</span><span style="background:black;color:white;">&gt; GetAllSubkeys(</span><span style="background:black;color:#2b91af;">RegistryKey </span><span style="background:black;color:white;">StartkeyIn,
                                                              </span><span style="background:black;color:#2b91af;">String </span><span style="background:black;color:white;">NodeKey) {
            _instance.InvokePopulateProgress();

            </span><span style="background:black;color:#ecc03e;">if </span><span style="background:black;color:white;">(StartkeyIn != </span><span style="background:black;color:#ecc03e;">null</span><span style="background:black;color:white;">) {
                </span><span style="background:black;color:#2b91af;">RegistryKey </span><span style="background:black;color:white;">SubItemRoot;

                </span><span style="background:black;color:#ecc03e;">if </span><span style="background:black;color:white;">(TryOpenSubKey(StartkeyIn, NodeKey, </span><span style="background:black;color:#ecc03e;">out </span><span style="background:black;color:white;">SubItemRoot)) {
                    </span><span style="background:black;color:#ecc03e;">yield return </span><span style="background:black;color:white;">SubItemRoot;

                    </span><span style="background:black;color:#ecc03e;">foreach </span><span style="background:black;color:white;">(</span><span style="background:black;color:#ecc03e;">var </span><span style="background:black;color:white;">sub </span><span style="background:black;color:#ecc03e;">in

                            </span><span style="background:black;color:white;">SubItemRoot.GetSubKeyNames().SelectMany( </span><span style="background:black;color:#f5f01f;">// Recursion back into this method
                                    </span><span style="background:black;color:white;">s =&gt; GetAllSubkeys(SubItemRoot, s)))

                        </span><span style="background:black;color:#ecc03e;">yield return </span><span style="background:black;color:white;">sub;
                }
            }
        }

        </span><span style="background:black;color:#ecc03e;">private static bool </span><span style="background:black;color:white;">TryOpenSubKey(</span><span style="background:black;color:#2b91af;">RegistryKey </span><span style="background:black;color:white;">StartFrom, </span><span style="background:black;color:#2b91af;">String </span><span style="background:black;color:white;">Name,
                                          </span><span style="background:black;color:#ecc03e;">out </span><span style="background:black;color:#2b91af;">RegistryKey </span><span style="background:black;color:white;">itemOut) {
            </span><span style="background:black;color:#ecc03e;">var </span><span style="background:black;color:white;">bIsOK = </span><span style="background:black;color:#ecc03e;">false</span><span style="background:black;color:white;">;
            itemOut = </span><span style="background:black;color:#ecc03e;">null</span><span style="background:black;color:white;">;

            </span><span style="background:black;color:#ecc03e;">try </span><span style="background:black;color:white;">{
                itemOut = StartFrom.OpenSubKey(Name,
                        </span><span style="background:black;color:#b8a223;">RegistryKeyPermissionCheck</span><span style="background:black;color:white;">.ReadSubTree);
                </span><span style="background:black;color:#ecc03e;">if </span><span style="background:black;color:white;">(itemOut != </span><span style="background:black;color:#ecc03e;">null</span><span style="background:black;color:white;">)
                    bIsOK = </span><span style="background:black;color:#ecc03e;">true</span><span style="background:black;color:white;">;
            }
            </span><span style="background:black;color:#ecc03e;">catch </span><span style="background:black;color:white;">(</span><span style="background:black;color:#2b91af;">Exception </span><span style="background:black;color:white;">ex) {
                InvokePopulateProgressItemError(</span><span style="background:black;color:#ecc03e;">new </span><span style="background:black;color:#2b91af;">PopulateProgressEventArgs</span><span style="background:black;color:white;">(-1,
                        ex.Message + </span><span style="background:black;color:#2b91af;">Environment</span><span style="background:black;color:white;">.NewLine + </span><span style="background:black;color:#ecc03e;">&quot;Key=&quot; </span><span style="background:black;color:white;">+ StartFrom.Name + </span><span style="background:black;color:#ecc03e;">&quot; failed trying &quot; </span><span style="background:black;color:white;">+ Name));
            }

            </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">bIsOK;
        }
                                  }

    </span><span style="background:black;color:#ecc03e;">public delegate void </span><span style="background:black;color:#2b91af;">PopulateProgressDelegateError</span><span style="background:black;color:white;">(
            </span><span style="background:black;color:#ecc03e;">object </span><span style="background:black;color:white;">sender, </span><span style="background:black;color:#2b91af;">PopulateProgressEventArgs </span><span style="background:black;color:white;">args);

    </span><span style="background:black;color:#ecc03e;">public delegate void </span><span style="background:black;color:#2b91af;">PopulateProgressDelegate</span><span style="background:black;color:white;">(
            </span><span style="background:black;color:#ecc03e;">object </span><span style="background:black;color:white;">sender, </span><span style="background:black;color:#2b91af;">PopulateProgressEventArgs </span><span style="background:black;color:white;">args);
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code">&#160;</pre>
<pre class="code"><span style="background:black;color:#ecc03e;">namespace </span><span style="background:black;color:white;">domaindotnet.LinqToRegistry {
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System;

    </span><span style="background:black;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black;color:#9ff5fd;">Simple EventArg for the two progress events
    </span><span style="background:black;color:gray;">///
    /// </span><span style="background:black;color:#9ff5fd;">NOTE: There will typically be some errors
    </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">which is fine as some parts of the Registry are
    </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">not accessible with standard security
    </span><span style="background:black;color:gray;">/// &lt;/summary&gt;
    </span><span style="background:black;color:#ecc03e;">public class </span><span style="background:black;color:#2b91af;">PopulateProgressEventArgs </span><span style="background:black;color:white;">: </span><span style="background:black;color:#2b91af;">EventArgs </span><span style="background:black;color:white;">{

        </span><span style="background:black;color:#ecc03e;">private readonly string </span><span style="background:black;color:white;">_keyName;

        </span><span style="background:black;color:#ecc03e;">public </span><span style="background:black;color:white;">PopulateProgressEventArgs(</span><span style="background:black;color:#ecc03e;">int </span><span style="background:black;color:white;">itemCount) : </span><span style="background:black;color:#ecc03e;">this</span><span style="background:black;color:white;">(itemCount, </span><span style="background:black;color:#ecc03e;">null</span><span style="background:black;color:white;">) {}

        </span><span style="background:black;color:#ecc03e;">public </span><span style="background:black;color:white;">PopulateProgressEventArgs(</span><span style="background:black;color:#ecc03e;">int </span><span style="background:black;color:white;">itemCount, </span><span style="background:black;color:#2b91af;">String </span><span style="background:black;color:white;">KeyName) {

            ItemCount = itemCount;
            _keyName = KeyName;

        }

        </span><span style="background:black;color:#ecc03e;">public </span><span style="background:black;color:white;">PopulateProgressEventArgs() : </span><span style="background:black;color:#ecc03e;">this</span><span style="background:black;color:white;">(-1, </span><span style="background:black;color:#ecc03e;">null</span><span style="background:black;color:white;">) {}

        </span><span style="background:black;color:#ecc03e;">public string </span><span style="background:black;color:white;">KeyName {
            </span><span style="background:black;color:#ecc03e;">get </span><span style="background:black;color:white;">{ </span><span style="background:black;color:#ecc03e;">return </span><span style="background:black;color:white;">_keyName; }
        }

        </span><span style="background:black;color:#ecc03e;">public int </span><span style="background:black;color:white;">ItemCount { </span><span style="background:black;color:#ecc03e;">get</span><span style="background:black;color:white;">; </span><span style="background:black;color:#ecc03e;">internal set</span><span style="background:black;color:white;">; }
    }
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code">&#160;</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Although not required, if you want to use this Registry Server (it makes a fantastic ‘mock’ server – although not really a Mock at all) put all the code above in a separate assembly for ease of use.</p>
<p>It’s great for trying our many variants of Linq queries over objects (as we do here) as the Registry – although a bit dangerous to muck about with – is a nice hierarchical source with enough interesting turns to make it fun. </p>
<p>In practice we rarely need to change the registry but if we did, it would be though this (we would carefully evolve it so it could perform controlled updates).</p>
<p>&#160;</p>
<h2>The Regression Tests</h2>
<p>&#160;</p>
<p>So we are using xUnit because we like it. Use whatever you want. The code shown next is the abstract base class our real test cases will use:</p>
<p>&#160;</p>
<pre class="code"><span style="background:black;color:#ecc03e;">namespace </span><span style="background:black;color:white;">LinqToORMValidation {
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">domaindotnet.LinqToRegistry;

    </span><span style="background:black;color:#ecc03e;">public abstract class </span><span style="background:black;color:#2b91af;">BaseTestContext </span><span style="background:black;color:white;">{

        </span><span style="background:black;color:#ecc03e;">private static void </span><span style="background:black;color:white;">RegistryServer_OnPopulateProgress(</span><span style="background:black;color:#ecc03e;">object </span><span style="background:black;color:white;">sender, </span><span style="background:black;color:#2b91af;">PopulateProgressEventArgs </span><span style="background:black;color:white;">args)
        {
            </span><span style="background:black;color:#f5f01f;">//Console.WriteLine(&quot;Processed &quot; + args.ItemCount + &quot; items&quot;);

        </span><span style="background:black;color:white;">}

        </span><span style="background:black;color:#ecc03e;">private static void </span><span style="background:black;color:white;">RegistryServer_OnPopulateProgressError(</span><span style="background:black;color:#ecc03e;">object </span><span style="background:black;color:white;">sender, </span><span style="background:black;color:#2b91af;">PopulateProgressEventArgs </span><span style="background:black;color:white;">args)
        {
            </span><span style="background:black;color:#2b91af;">Console</span><span style="background:black;color:white;">.WriteLine(</span><span style="background:black;color:#ecc03e;">&quot;Error : &quot; </span><span style="background:black;color:white;">+ args.KeyName);
        }
        </span><span style="background:black;color:#ecc03e;">protected </span><span style="background:black;color:white;">BaseTestContext() {

            </span><span style="background:black;color:#2b91af;">RegistryServer</span><span style="background:black;color:white;">.PopulateProgress += RegistryServer_OnPopulateProgress;
            </span><span style="background:black;color:#2b91af;">RegistryServer</span><span style="background:black;color:white;">.PopulateProgressItemError += RegistryServer_OnPopulateProgressError;
            </span><span style="background:black;color:#2b91af;">RegistryServer</span><span style="background:black;color:white;">.Initialize();

            </span><span style="background:black;color:#2b91af;">Console</span><span style="background:black;color:white;">.WriteLine(</span><span style="background:black;color:#ecc03e;">&quot;Initialization Complete. Total Records = &quot; </span><span style="background:black;color:white;">+ </span><span style="background:black;color:#2b91af;">RegistryServer</span><span style="background:black;color:white;">.Count);
        }

    }
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<p>NOTE: Un-Comment the Console.WriteLine in the OnPopulateProgress to view the status as it runs.</p>
<blockquote>
<p>The main area to see is the protected constructor. It’s clear that the Singleton is exposing a separate Initialize() method (we did this on purpose as it can take a little while for all those keys to get inside the HashSet&lt;T&gt; and debugging things if they go wrong in say a static constructor is harder then making a long-running initialization explicit. In general a good design decision we believe.</p>
</blockquote>
<p>&#160;</p>
<p>So the final part of code for this post at least is the first test which indeed shows the exact query from the beginning working:&quot;</p>
<pre class="code"><span style="background:black;color:white;"></span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black;color:#ecc03e;">namespace </span><span style="background:black;color:white;">LinqToORMValidation {
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System.Diagnostics;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">System.Linq;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">domaindotnet.LinqToRegistry;
    </span><span style="background:black;color:#ecc03e;">using </span><span style="background:black;color:white;">Xunit;

    </span><span style="background:black;color:#ecc03e;">public class </span><span style="background:black;color:#2b91af;">RegistryServerValidation </span><span style="background:black;color:white;">: </span><span style="background:black;color:#2b91af;">BaseTestContext </span><span style="background:black;color:white;">{

        </span><span style="background:black;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black;color:#9ff5fd;">As a Linq IEnumerable</span><span style="background:black;color:gray;">&lt;T&gt; </span><span style="background:black;color:#9ff5fd;">result
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">if anything changed, the
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">underlying HashSet</span><span style="background:black;color:gray;">&lt;T&gt; </span><span style="background:black;color:#9ff5fd;">would not change. However if this
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">were a direct reference to the HashSet the values ARE
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">changeable. The idea is to project out immutable results
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">from the Registry server and indeed treat all the data
        </span><span style="background:black;color:gray;">/// </span><span style="background:black;color:#9ff5fd;">as read only
        </span><span style="background:black;color:gray;">/// &lt;/summary&gt;
        </span><span style="background:black;color:white;">[</span><span style="background:black;color:#2b91af;">Fact</span><span style="background:black;color:white;">]
        </span><span style="background:black;color:#ecc03e;">public void </span><span style="background:black;color:white;">should_prove_basic() {

            </span><span style="background:black;color:#f5f01f;">// Find the registry key(s) that have
            // VisualStudo in the name and end in
            // 'FontsAndColors' that also have at least
            // one value defined inside they key

            </span><span style="background:black;color:#ecc03e;">var </span><span style="background:black;color:white;">sw =</span><span style="background:black;color:#2b91af;">Stopwatch</span><span style="background:black;color:white;">.StartNew();

            </span><span style="background:black;color:#ecc03e;">var </span><span style="background:black;color:white;">FindFontsColors = </span><span style="background:black;color:#ecc03e;">from </span><span style="background:black;color:white;">rk </span><span style="background:black;color:#ecc03e;">in </span><span style="background:black;color:#2b91af;">RegistryServer</span><span style="background:black;color:white;">.Hklm
                                  </span><span style="background:black;color:#ecc03e;">where
                                          </span><span style="background:black;color:white;">rk.Name.Contains(</span><span style="background:black;color:#ecc03e;">&quot;VisualStudio&quot;</span><span style="background:black;color:white;">) &amp;&amp;
                                          rk.Name.EndsWith(</span><span style="background:black;color:#ecc03e;">&quot;FontsAndColors&quot;</span><span style="background:black;color:white;">) &amp;&amp;
                                          rk.ValueCount &gt; 0

                                  </span><span style="background:black;color:#ecc03e;">select </span><span style="background:black;color:white;">rk.Name;

            </span><span style="background:black;color:#ecc03e;">var </span><span style="background:black;color:white;">countMatched = FindFontsColors.Count();

            sw.Stop();

            </span><span style="background:black;color:#2b91af;">Console</span><span style="background:black;color:white;">.WriteLine(</span><span style="background:black;color:#ecc03e;">&quot;Total Records Matched = &quot; </span><span style="background:black;color:white;">+ countMatched);
            </span><span style="background:black;color:#2b91af;">Console</span><span style="background:black;color:white;">.WriteLine(</span><span style="background:black;color:#ecc03e;">&quot;Search Took : &quot; </span><span style="background:black;color:white;">+ sw.ElapsedMilliseconds + </span><span style="background:black;color:#ecc03e;">&quot; ms&quot;</span><span style="background:black;color:white;">);

            </span><span style="background:black;color:#f5f01f;">// Assert it took less then one second
            </span><span style="background:black;color:#2b91af;">Assert</span><span style="background:black;color:white;">.True(sw.ElapsedMilliseconds &lt; 1000);
            </span><span style="background:black;color:#2b91af;">ObjectDumper</span><span style="background:black;color:white;">.Write(FindFontsColors);
        }

    }
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>&#160;</p>
<p>&#160;</p>
<p>For this test cases we are very specifically finding any keys across any in HKLM matching the conditions: </p>
<ul>
<li>The key name ‘VisualStudio’ somewhere. </li>
<li>The key ends with &#8216;FontsAndColors’ </li>
<li>The key has at least one value inside (you’ll see why in the next post when things get harder) </li>
</ul>
<p>We also introduce a time to show off the speed of the HashSet&lt;T&gt;.</p>
<p>&#160;</p>
<p>Here I am making the assumption that the name of the key holds identity, and if null, we use standard null semantics (as defined in relational algebra).</p>
<p>The only few interesting points are the use of the static RuntimeHelpers class from .NET as the fact we are using the singleton static instance as the Equality instance.</p>
<p>&#160;</p>
<h2>Running the Code</h2>
<p>&#160;</p>
<p><a href="http://dcarr.files.wordpress.com/2008/09/image1.png"><img style="border-width:0;" title="image" border="0" alt="image" src="http://dcarr.files.wordpress.com/2008/09/image-thumb1.png?w=700&#038;h=526" width="700" height="526" /></a> </p>
<p>As expected we received a few errors, but they make sense as they are protected areas of the registry.</p>
<h3>So we matched across 233142 instances of RegistryKey with three conditions in 746ms. Try that in RegEdt32!!</h3>
<p>&#160;</p>
<div align="right">
<table border="1" cellspacing="4" cellpadding="4" width="400" align="right">
<tbody>
<tr>
<td valign="top" width="390">
<p align="center">MSDN Facts</p>
<p>The HashSet&lt;T&gt; class provides high performance set operations. A set is a collection that contains no duplicate elements, and whose elements are in no particular order. </p>
<p>The capacity of a HashSet&lt;T&gt; object is the number of elements that the object can hold. A HashSet&lt;T&gt; object&#8217;s capacity automatically increases as elements are added to the object. </p>
<p>The HashSet&lt;T&gt; class is a set collection that implements the <a href="http://msdn.microsoft.com/en-us/library/system.collections.icollection.aspx">ICollection</a> interface and the <a href="http://msdn.microsoft.com/en-us/library/92t2ye13.aspx">ICollection&lt;(Of &lt;(T&gt;)&gt;)</a> generic interface. </p>
<p><img src="http://i.msdn.microsoft.com/platform/Controls/CollapsibleArea/resources/minus.gif" /> Set Collections </p>
<p><a name="sectionToggle0"></a></p>
<p>In mathematics, a set is a collection of distinct objects that is usually defined by a rule that determines whether an element is a member of a particular set. For example, a set could be defined to contain &quot;all the odd numbers between 1 and 21&quot; or the numbers &quot;1, 3, 5 and 7&quot;. </p>
<p><img src="http://i.msdn.microsoft.com/platform/Controls/CollapsibleArea/resources/minus.gif" /> The HashSet Class </p>
<p><a name="sectionToggle1"></a></p>
<p>The <a href="http://msdn.microsoft.com/en-us/library/bb359438.aspx">HashSet&lt;(Of &lt;(T&gt;)&gt;)</a> class is based on the model of mathematical sets and provides high-performance set operations similar to accessing the keys of the <a href="http://msdn.microsoft.com/en-us/library/xfhwa508.aspx">Dictionary&lt;(Of &lt;(TKey, TValue&gt;)&gt;)</a> or <a href="http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx">Hashtable</a> collections. In simple terms, the <a href="http://msdn.microsoft.com/en-us/library/bb359438.aspx">HashSet&lt;(Of &lt;(T&gt;)&gt;)</a> class can be thought of as a <a href="http://msdn.microsoft.com/en-us/library/xfhwa508.aspx">Dictionary&lt;TKey, TValue&gt;</a> collection without values. </p>
<p>A <a href="http://msdn.microsoft.com/en-us/library/bb359438.aspx">HashSet&lt;(Of &lt;(T&gt;)&gt;)</a> collection is not sorted and cannot contain duplicate elements. If order or element duplication is more important than performance for your application, consider using the <a href="http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx">List&lt;(Of &lt;(T&gt;)&gt;)</a> class together with the <a href="http://msdn.microsoft.com/en-us/library/3da4abas.aspx">Sort</a> method. </p>
<p><a href="http://msdn.microsoft.com/en-us/library/bb359438.aspx">HashSet&lt;(Of &lt;(T&gt;)&gt;)</a> provides many mathematical set operations, such as set addition (unions) and set subtraction. The following table lists the provided <a href="http://msdn.microsoft.com/en-us/library/bb359438.aspx">HashSet&lt;(Of &lt;(T&gt;)&gt;)</a> operations and their mathematical equivalents. </p>
<p>HashSet(Of T) operation </p>
<p>Mathematical equivalent </p>
<p><a href="http://msdn.microsoft.com/en-us/library/bb342097.aspx">UnionWith</a></p>
<p>Union or set addition </p>
<p><a href="http://msdn.microsoft.com/en-us/library/bb293080.aspx">IntersectWith</a></p>
<p>Intersection </p>
<p><a href="http://msdn.microsoft.com/en-us/library/bb299875.aspx">ExceptWith</a></p>
<p>Set subtraction </p>
<p><a href="http://msdn.microsoft.com/en-us/library/bb336848.aspx">SymmetricExceptWith</a></p>
<p>Symmetric difference </p>
<p>In addition to the listed set operations, the <a href="http://msdn.microsoft.com/en-us/library/bb359438.aspx">HashSet&lt;(T&gt;</a> class also provides methods for determining set equality, overlap of sets, and whether a set is a subset or superset of another set. </p>
<p>&#160;</p>
</p>
</td>
</tr>
</tbody>
</table>
</div>
<p>So far this has only set a baseline for the next exploration into these new methods provided in the HashSet&lt;T&gt; you might not have been aware of which we can now easily use: </p>
<p>&#160;</p>
<div id="contents">
<div style="height:607px;" id="ctl00_rs1_ra1" class="resizableArea">
<div id="ctl00_rs1_raRight" class="rightSection">
<div class="RightPanel">
<div class="ContentArea">
<div class="topic">
<div id="mainSection">
<div id="mainBody">
<div id="ctl00_rs1_mainContentContainer_cpe804725" class="MTPS_CollapsibleRegion">
<div style="width:auto;display:block;height:auto;overflow:visible;" id="ctl00_rs1_mainContentContainer_cpe804725_c" class="MTPS_CollapsibleSection">
<div style="border-bottom:medium none;border-left:medium none;display:block;border-top:medium none;border-right:medium none;" class="MTPS_CollapsibleSection">
<div class="tableSection">
<table width="50%">
<tbody>
<tr>
<th width="172">
<p>HashSet(Of T) operation </p>
</th>
<th width="176">
<p>LINQ equivalent </p>
</th>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl84" href="http://msdn.microsoft.com/en-us/library/bb342097.aspx">UnionWith</a></span> </p>
</td>
<td width="176">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl85" href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.union.aspx">Union</a></span> </p>
</td>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl86" href="http://msdn.microsoft.com/en-us/library/bb293080.aspx">IntersectWith</a></span> </p>
</td>
<td width="176">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl87" href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.intersect.aspx">Intersect</a></span> </p>
</td>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl88" href="http://msdn.microsoft.com/en-us/library/bb299875.aspx">ExceptWith</a></span> </p>
</td>
<td width="176">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl89" href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except.aspx">Except</a></span> </p>
</td>
</tr>
<tr>
<td width="172">
<p>Not Provided </p>
</td>
<td width="176">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl90" href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.distinct.aspx">Distinct</a></span> </p>
</td>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl91" href="http://msdn.microsoft.com/en-us/library/bb336848.aspx">SymmetricExceptWith</a></span> </p>
</td>
<td width="176">
<p>Not Provided. </p>
</td>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl92" href="http://msdn.microsoft.com/en-us/library/bb355623.aspx">Overlaps</a></span> </p>
</td>
<td width="176">
<p>Not Provided. </p>
</td>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl93" href="http://msdn.microsoft.com/en-us/library/bb358446.aspx">IsSubsetOf</a></span> </p>
</td>
<td width="176">
<p>Not Provided. </p>
</td>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl94" href="http://msdn.microsoft.com/en-us/library/bb351418.aspx">IsProperSubsetOf</a></span> </p>
</td>
<td width="176">
<p>Not Provided. </p>
</td>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl95" href="http://msdn.microsoft.com/en-us/library/bb346923.aspx">IsSupersetOf</a></span> </p>
</td>
<td width="176">
<p>Not Provided. </p>
</td>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl96" href="http://msdn.microsoft.com/en-us/library/bb299734.aspx">IsProperSupersetOf</a></span> </p>
</td>
<td width="176">
<p>Not Provided. </p>
</td>
</tr>
<tr>
<td width="172">
<p><span><a id="ctl00_rs1_mainContentContainer_ctl97" href="http://msdn.microsoft.com/en-us/library/bb346516.aspx">SetEquals</a></span> </p>
</td>
<td width="176">
<p>Not Provided. </p>
</td>
</tr>
</tbody>
</table></div>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div>
</p></div>
<p>&#160;</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:57bcd4fd-45be-4e95-9e9b-7dba54a771c6" class="wlWriterSmartContent">Technorati Tags: <a href="http://technorati.com/tags/Linq" rel="tag">Linq</a>,<a href="http://technorati.com/tags/HashSet" rel="tag">HashSet</a>,<a href="http://technorati.com/tags/ORM" rel="tag">ORM</a>,<a href="http://technorati.com/tags/NHibernate" rel="tag">NHibernate</a>,<a href="http://technorati.com/tags/Linq+to+NHibernate" rel="tag">Linq to NHibernate</a>,<a href="http://technorati.com/tags/Linq+Undocumented" rel="tag">Linq Undocumented</a>,<a href="http://technorati.com/tags/Functional+Programming" rel="tag">Functional Programming</a>,<a href="http://technorati.com/tags/.NET+3.5" rel="tag">.NET 3.5</a></div>
<div class="wlWriterHeaderFooter" style="text-align:left;margin:0;padding:4px 0;"><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2008%2f09%2f08%2fthe_fastest_dot_net_hash_set_collection_with_linq_extended_features%2f&amp;title=Expose+New+Linq+Operations+from+the+Screaming+HashSet%3cT%3e+Collection"><img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /></a></div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/874/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/874/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/874/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/874/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/874/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/874/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/874/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/874/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/874/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/874/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/874/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/874/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=874&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/09/08/the_fastest_dot_net_hash_set_collection_with_linq_extended_features/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/09/premature-6-thumb.jpg" medium="image">
			<media:title type="html">premature_optimization</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/09/image-thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://i.msdn.microsoft.com/platform/Controls/CollapsibleArea/resources/minus.gif" medium="image" />

		<media:content url="http://i.msdn.microsoft.com/platform/Controls/CollapsibleArea/resources/minus.gif" medium="image" />

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>
	</item>
		<item>
		<title>Master Generic Type Constrains : A critical success factor in Linq Development</title>
		<link>http://team.pushbomb.com/2008/06/27/master-generic-type-constrains-a-critical-success-factor-in-linq-development/</link>
		<comments>http://team.pushbomb.com/2008/06/27/master-generic-type-constrains-a-critical-success-factor-in-linq-development/#comments</comments>
		<pubDate>Fri, 27 Jun 2008 17:07:06 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[Generics]]></category>
		<category><![CDATA[.NET 2.0]]></category>
		<category><![CDATA[Assumed Knowledge]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[Core Knowledge]]></category>
		<category><![CDATA[Linq to Objects]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/06/27/master-generic-type-constrains-a-critical-success-factor-in-linq-development/</guid>
		<description><![CDATA[An item we often see teams ‘leaving money on the table’ with is a failure to leverage (or leverage fully) generic type constraints. Now with Linq you cannot get away with it anymore as for now, although far more powerful, there are still long lines of complex generic delegate types to navigate.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=365&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p> </p>
<p>More accurately called ..<a href="http://research.microsoft.com/~akenn/generics/ECOOP06.pdf">&#8216;Variance and Generalized Constraints for C# Generics&#8217;)</a> (1)</p>
<p><strong>An item we often see teams ‘leaving money on the table’ with is a failure to leverage (or leverage fully) generic type constraints. Now with Linq you cannot get away with it anymore as for now, although far more powerful, there are still long lines of complex generic delegate types to navigate.</strong></p>
<p>This post based on the docs from MSDN, however we’ve added some significant teeth we believe (with more to come) We at least made this potentially more ‘real world’ in complexity.</p>
<div id="ctl00_LibFrame_ra1" class="resizableArea">
<div id="ctl00_LibFrame_raRight" class="rightSection">
<div id="mainSection">
<div id="mainBody">
<div class="topic">
<div id="mainSection">
<div id="mainBody">
<p class="introduction">When you define a generic class, you can apply restrictions to the kinds of types that client code can use for type arguments when it instantiates your class. If client code tries to instantiate your class by using a type that is not allowed by a constraint, the result is a compile-time error. These restrictions are called constraints. Constraints are specified by using the <span class="keyword">where</span> contextual keyword. (NOTE: the constraint is LITERAL unless specified otherwise)</p>
<h1>where T: struct    (literal)</h1>
<blockquote><p>The type argument must be a value type. Any value type except <a href="http://msdn.microsoft.com/en-us/library/system.nullable.aspx">Nullable</a> can be specified.</p>
<p>See <a href="http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx">Using Nullable Types (C# Programming Guide)</a> for more information.</p></blockquote>
<h1>where T : class   (literal)</h1>
<blockquote><p>The type argument must be a reference type; this applies also to any class, interface, delegate, or array type.</p></blockquote>
<h1>where T : new()   (literal)</h1>
<blockquote><p>The type argument must have a public parameterless constructor. When used together with other constraints, the new() constraint must be specified last.</p></blockquote>
<h1>where T : SomeClassName   (non-literal)</h1>
<blockquote><p>Example:</p>
<p><span style="background:#100d0c;color:#8ac5ff;">public class Stream</span><span style="background:#100d0c;color:#64b1ff;">List</span><span style="background:#100d0c;color:#c0c0c0;">&lt;</span><span style="background:#100d0c;color:#ffffff;">T</span><span style="background:#100d0c;color:#c0c0c0;">&gt; </span><span style="background:#100d0c;color:#ffffff;">: </span><span style="background:#100d0c;color:#64b1ff;">List</span><span style="background:#100d0c;color:#c0c0c0;">&lt;</span><span style="background:#100d0c;color:#ffffff;">T</span><span style="background:#100d0c;color:#c0c0c0;">&gt; </span><span style="background:#100d0c;color:#8ac5ff;">where </span><span style="background:#100d0c;color:#ffffff;">T : </span><span style="background:#100d0c;color:#8ac5ff;">Stream</span><a href="http://11011.net/software/vspaste"></a></p>
<p>Here we are creating a custom collection from List&lt;T&gt; and also ensuring (see above) that values are reference types.</p></blockquote>
<h1>where T : someinterface    (non-literal)</h1>
<blockquote><p>The type argument must be or implement the specified interface. Multiple interface constraints can be specified. The constraining interface can also be generic.</p></blockquote>
<h1>where T : U       (non-literal)</h1>
<blockquote><p>The type argument supplied for T must be or derive from the argument supplied for U. This is called a naked type constraint.</p></blockquote>
<h2>domain.dot.net addition</h2>
<p><span style="font-size:small;color:#ffffff;">Here is an example of a pattern we use that combines the concept of generic constraints to make Extension methods far more effective.</span></p>
<p><span style="font-size:small;color:#ffffff;">Assume you want to allow any Enum to support seamless conversion to a Linq sequence an IEnumerable&lt;TType&gt; where TType : Enum</span></p>
<p><span style="font-size:small;color:#ffffff;">Wait! You cannot do that! Ugh…Enum is one of the invalid constraint types (as is delegate, Array, etc.)</span></p>
<p><span style="font-size:small;color:#ffffff;">Here is how we ‘solve’ this:</span></p>
<p><span style="font-size:small;color:#ffffff;">1) Assert as much as you can about a type</span></p>
<p><span style="font-size:small;color:#ffffff;">2) Do run-time checks if needed</span></p>
<p><span style="font-size:small;color:#ffffff;">Here is the header:</span></p>
<p align="left"><span style="background:#16140f;color:#22bdff;">public static </span><span style="background:#16140f;color:#dde074;">IEnumerable</span><span style="background:#16140f;color:#c0c0c0;">&lt;</span><span style="background:#16140f;color:#eddfc0;">TEnumType</span><span style="background:#16140f;color:#c0c0c0;">&gt; </span><span style="background:#16140f;color:#eddfc0;">EnumToLinq</span><span style="background:#16140f;color:#c0c0c0;">&lt;</span><span style="background:#16140f;color:#eddfc0;">TEnumType</span><span style="background:#16140f;color:#c0c0c0;">&gt;</span><span style="background:#16140f;color:#e7696c;">( <br />
</span><span style="background:#16140f;color:#22bdff;">                this </span><span style="background:#16140f;color:#eddfc0;">TEnumType target</span><span style="background:#16140f;color:#e7696c;">)</p>
<p>                     </span><span style="background:#16140f;color:#22bdff;">where </span><span style="background:#16140f;color:#eddfc0;">TEnumType </span><span style="background:#16140f;color:#e7696c;">: </span><span style="background:#16140f;color:#22bdff;">struct</span><span style="background:#16140f;color:#e7696c;">, </span><span style="background:#16140f;color:#dde074;">IComparable</span><span style="background:#16140f;color:#e7696c;">, </span><span style="background:#16140f;color:#dde074;">IFormattable</span><span style="background:#16140f;color:#e7696c;">, </span><span style="background:#16140f;color:#dde074;">IConvertible</span><a href="http://11011.net/software/vspaste"></a></p>
<p><span style="font-size:small;color:#ffffff;">If that immediately makes you feel sick, well this is what refactored code looks like where you try to not force an entire team to work daily here, but it’s unavoidable. After having our heads in this for a while you absolutely need to master this to be a senior Linq developer (and looking at others code is always fantastic for us as we find things we learn we were doing wrong).</span></p>
<p><span style="font-size:small;color:#ffffff;">And here is the full extension method (go ahead and use it for whatever you want if you find value):</span></p>
<p><span style="background:#16140f;color:#22bdff;">public static </span><span style="background:#16140f;color:#dde074;">IEnumerable</span><span style="background:#16140f;color:#c0c0c0;">&lt;</span><span style="background:#16140f;color:#eddfc0;">TEnumType</span><span style="background:#16140f;color:#c0c0c0;">&gt; </span><span style="background:#16140f;color:#eddfc0;">EnumToLinq</span><span style="background:#16140f;color:#c0c0c0;">&lt;</span><span style="background:#16140f;color:#eddfc0;">TEnumType</span><span style="background:#16140f;color:#c0c0c0;">&gt;</span><span style="background:#16140f;color:#e7696c;">(</p>
<p>                 </span><span style="background:#16140f;color:#22bdff;">this </span><span style="background:#16140f;color:#eddfc0;">TEnumType target</span><span style="background:#16140f;color:#e7696c;">)</p>
<p>                            </span><span style="background:#16140f;color:#22bdff;">where </span><span style="background:#16140f;color:#eddfc0;">TEnumType </span><span style="background:#16140f;color:#e7696c;">: </span><span style="background:#16140f;color:#22bdff;">struct</span><span style="background:#16140f;color:#e7696c;">, </span><span style="background:#16140f;color:#dde074;">IComparable</span><span style="background:#16140f;color:#e7696c;">,</p>
<p>                                  </span><span style="background:#16140f;color:#dde074;">IFormattable</span><span style="background:#16140f;color:#e7696c;">, </span><span style="background:#16140f;color:#dde074;">IConvertible </span><span style="background:#16140f;color:#e7696c;">{</p>
<p>                                  </span><span style="background:#16140f;color:#22bdff;">var </span><span style="background:#16140f;color:#eddfc0;">_type </span><span style="background:#16140f;color:#c0c0c0;">= </span><span style="background:#16140f;color:#eddfc0;">target</span><span style="background:#16140f;color:#c0c0c0;">.</span><span style="background:#16140f;color:#eddfc0;">GetType</span><span style="background:#16140f;color:#e7696c;">();</p>
<p>                                   i</span><span style="background:#16140f;color:#22bdff;">if </span><span style="background:#16140f;color:#e7696c;">(</span><span style="background:#16140f;color:#c0c0c0;">!</span><span style="background:#16140f;color:#eddfc0;">_type</span><span style="background:#16140f;color:#c0c0c0;">.</span><span style="background:#16140f;color:#eddfc0;">BaseType</span><span style="background:#16140f;color:#c0c0c0;">.</span><span style="background:#16140f;color:#eddfc0;">Equals</span><span style="background:#16140f;color:#e7696c;">(</span><span style="background:#16140f;color:#22bdff;">typeof </span><span style="background:#16140f;color:#e7696c;">(</span><span style="background:#16140f;color:#e7d97a;">Enum</span><span style="background:#16140f;color:#e7696c;">)))</p>
<p>                                        </span><span style="background:#16140f;color:#22bdff;">throw new </span><span style="background:#16140f;color:#e7d97a;">TypeInitializationException</span><span style="background:#16140f;color:#e7696c;">(</p>
<p>                                        </span><span style="background:#16140f;color:#eddfc0;">_type</span><span style="background:#16140f;color:#c0c0c0;">.</span><span style="background:#16140f;color:#eddfc0;">FullName</span><span style="background:#16140f;color:#e7696c;">, </span><span style="background:#16140f;color:#22bdff;">new </span><span style="background:#16140f;color:#e7d97a;">InvalidOperationException</span><span style="background:#16140f;color:#e7696c;">(</p>
<p>                                           </span><span style="background:#16140f;color:#eddfc0;">_type</span><span style="background:#16140f;color:#c0c0c0;">.</span><span style="background:#16140f;color:#eddfc0;">Name </span><span style="background:#16140f;color:#c0c0c0;">+ </span><span style="background:#16140f;color:#a6f0e6;">&#8221; is not an Enum&#8221;</span></p>
<div><span style="background:#16140f;color:#e7696c;">))</p>
<p>                                                                              ; </span></div>
<p><span style="background:#16140f;color:#e7696c;">                  <span style="background:#16140f;color:#22bdff;">return </span><span style="background:#16140f;color:#e7d97a;">Enum</span><span style="background:#16140f;color:#c0c0c0;">.</span><span style="background:#16140f;color:#eddfc0;">GetValues</span><span style="background:#16140f;color:#e7696c;">(</span><span style="background:#16140f;color:#eddfc0;">_type</span><span style="background:#16140f;color:#e7696c;">)</span><span style="background:#16140f;color:#c0c0c0;">.</span><span style="background:#16140f;color:#eddfc0;">Cast</span><span style="background:#16140f;color:#c0c0c0;">&lt;</span><span style="background:#16140f;color:#eddfc0;">TEnumType</span><span style="background:#16140f;color:#c0c0c0;">&gt;</span><span style="background:#16140f;color:#e7696c;">(); } </span><a href="http://11011.net/software/vspaste"></a></p>
<p></span>Bottom line is we get a nice sequence we can use any Linq to Object expression on.</p>
<p>Here is an example of the above in use:</p>
<p><span style="background:#16140f;color:#adadad;">/// &lt;summary&gt;</p>
<p>/// </span><span style="background:#16140f;color:#7cfc00;">Using a simple bitwise this for now returns</p>
<p></span><span style="background:#16140f;color:#adadad;">/// </span><span style="background:#16140f;color:#7cfc00;">a predicate for later execution and resolution</p>
<p></span><span style="background:#16140f;color:#adadad;">/// </span><span style="background:#16140f;color:#7cfc00;">of a FilleystemInfo. This is used now in Linq</p>
<p></span><span style="background:#16140f;color:#adadad;">/// </span><span style="background:#16140f;color:#7cfc00;">queries to get back various types of things</p>
<p></span><span style="background:#16140f;color:#adadad;">/// </span><span style="background:#16140f;color:#7cfc00;">on the hard disk.</p>
<p></span><span style="background:#16140f;color:#adadad;">/// &lt;/summary&gt;</p>
<p>/// &lt;value&gt;</span><span style="background:#16140f;color:#7cfc00;">To predicate.</span><span style="background:#16140f;color:#adadad;">&lt;/value&gt;</p>
<p>/// </span></p>
<div><span style="background:#16140f;color:#7cfc00;">Documentation Created 6/27/2008 </span></div>
<p><span style="background:#16140f;color:#7cfc00;"><span style="background:#16140f;color:#22bdff;">private static </span><span style="background:black;color:#e1e100;">Predicate</span><span style="background:#16140f;color:#c0c0c0;">&lt;</span><span style="background:#16140f;color:#e7d97a;">FileSystemInfo</span><span style="background:#16140f;color:#c0c0c0;">&gt; </span><span style="background:#16140f;color:#eddfc0;">ToPredicate </span><span style="background:#16140f;color:#e7696c;">{</p>
<p></span><span style="background:#16140f;color:#22bdff;">get </span><span style="background:#16140f;color:#e7696c;">{</p>
<p></span></p>
<p></span><span style="background:#16140f;color:#7cfc00;">                          // NOTE: This sets the <br />
                      </span></p>
<div><span style="background:#16140f;color:#7cfc00;">    // class value (we only need 1 static)</p>
<p>                          // as well as uses a simple bitwise <br />
                          // &amp; to check if the Directory </span></div>
<p><span style="background:#16140f;color:#7cfc00;">                          // attribute is set</p>
<p>                          <span style="background:#16140f;color:#22bdff;">return </span><span style="background:#16140f;color:#eddfc0;">_persistendPred </span><span style="background:#16140f;color:#c0c0c0;">=</p>
<p></span><span style="background:#16140f;color:#eddfc0;">                                  fileInfo </span><span style="background:#16140f;color:#c0c0c0;">=&gt; </span><span style="background:#16140f;color:#e7696c;">((</span><span style="background:#16140f;color:#eddfc0;">fileInfo</span><span style="background:#16140f;color:#c0c0c0;">.</span><span style="background:#16140f;color:#eddfc0;">Attributes </span><span style="background:#16140f;color:#c0c0c0;">&amp; <br />
                                    </span><span style="background:#16140f;color:#c0c0c0;">   </span><span style="background:#16140f;color:#7cedea;">FileAttributes</span><span style="background:#16140f;color:#c0c0c0;">.</span><span style="background:#16140f;color:#eddfc0;">Directory</span><span style="background:#16140f;color:#e7696c;">) </span><span style="background:#16140f;color:#c0c0c0;">==</p>
<p>                                               </span><span style="background:#16140f;color:#7cedea;">FileAttributes</span><span style="background:#16140f;color:#c0c0c0;">.</span><span style="background:#16140f;color:#eddfc0;">Directory</span><span style="background:#16140f;color:#e7696c;">); }</p>
<p>                               </span><span style="background:#16140f;color:#e7696c;">}</p>
<p></span>Back to MSDN…..</p>
<p></span></p>
<h2><strong></strong></h2>
<h2><strong></strong></h2>
<h2><strong></strong></h2>
<h2><strong></strong></h2>
<h2><strong>Why Use Constraints</strong></h2>
<div id="ctl00_LibFrame_MainContent_cpe468231_c" class="MTPS_CollapsibleSection" style="display:block;overflow:visible;width:auto;height:auto;">
<div class="MTPS_CollapsibleSection" style="border-right:medium none;border-top:medium none;display:block;border-left:medium none;border-bottom:medium none;"><a name="sectionToggle0"></a></div>
<p>If you want to examine an item in a generic list to determine whether it is valid or to compare it to some other item, the compiler must have some guarantee that the operator or method it has to call will be supported by any type argument that might be specified by client code. This guarantee is obtained by applying one or more constraints to your generic class definition. For example, the base class constraint tells the compiler that only objects of this type or derived from this type will be used as type arguments. Once the compiler has this guarantee, it can allow methods of that type to be called in the generic class. Constraints are applied by using the contextual keyword <span class="keyword">where</span>. The following code example demonstrates the functionality we can add to the <span class="code">GenericList&lt;T&gt;</span> class (in <a id="ctl00_LibFrame_MainContent_ctl10" href="http://msdn.microsoft.com/en-us/library/0x6a29h6.aspx">Introduction to Generics (C# Programming Guide)</a>) by applying a base class constraint.</p>
<div>
<div id="ctl00_LibFrame_MainContent_ctl11_CSharp" class="libCScode">
<div class="CodeSnippetTitleBar">
<div class="CodeDisplayLanguage"> </div>
</div>
</div>
</div>
</div>
<p><span style="background:#100d0c;color:#8ac5ff;">public class </span><span style="background:#100d0c;color:#64b1ff;">Employee </span><span style="background:#100d0c;color:#ffffff;">{ </span><span style="background:#100d0c;color:#8ac5ff;">public </span><span style="background:#100d0c;color:#ffffff;">Employee(</span><span style="background:#100d0c;color:#8ac5ff;">string </span><span style="background:#100d0c;color:#ffffff;">s, </span><span style="background:#100d0c;color:#8ac5ff;">int </span><span style="background:#100d0c;color:#ffffff;">i) { Name </span><span style="background:#100d0c;color:#c0c0c0;">= </span><span style="background:#100d0c;color:#ffffff;">s; ID </span><span style="background:#100d0c;color:#c0c0c0;">= </span><span style="background:#100d0c;color:#ffffff;">i; } </span><span style="background:#100d0c;color:#8ac5ff;">public string </span><span style="background:#100d0c;color:#ffffff;">Name { </span><span style="background:#100d0c;color:#8ac5ff;">get</span><span style="background:#100d0c;color:#ffffff;">; </span><span style="background:#100d0c;color:#8ac5ff;">set</span><span style="background:#100d0c;color:#ffffff;">; } </span><span style="background:#100d0c;color:#8ac5ff;">public int </span><span style="background:#100d0c;color:#ffffff;">ID { </span><span style="background:#100d0c;color:#8ac5ff;">get</span><span style="background:#100d0c;color:#ffffff;">; </span><span style="background:#100d0c;color:#8ac5ff;">set</span><span style="background:#100d0c;color:#ffffff;">; } }</span><a href="http://11011.net/software/vspaste"></a></p>
<div></div>
<p><span style="background:#16140f;color:#e7696c;"><span style="background:#16140f;color:#22bdff;">     </span></p>
<div></div>
<p></span><span style="background:#16140f;color:#e7696c;"> </p>
<p></span><span style="background:#100d0c;color:#8ac5ff;">public class </span><span style="background:#100d0c;color:#64b1ff;">GenericList</span><span style="background:#100d0c;color:#c0c0c0;">&lt;</span><span style="background:#100d0c;color:#ffffff;">T</span><span style="background:#100d0c;color:#c0c0c0;">&gt; </span><span style="background:#100d0c;color:#8ac5ff;">where </span><span style="background:#100d0c;color:#ffffff;">T : </span><span style="background:#100d0c;color:#64b1ff;">Employee </span><span style="background:#100d0c;color:#ffffff;">{ </span><span style="background:#100d0c;color:#8ac5ff;">private </span><span style="background:#100d0c;color:#64b1ff;">Node </span><span style="background:#100d0c;color:#ffffff;">head; </span><span style="background:#100d0c;color:#8ac5ff;">public </span><span style="background:#100d0c;color:#ffffff;">GenericList() { head </span><span style="background:#100d0c;color:#c0c0c0;">= </span><span style="background:#100d0c;color:#8ac5ff;">null</span><span style="background:#100d0c;color:#ffffff;">; } </span><span style="background:#100d0c;color:#8ac5ff;">public void </span><span style="background:#100d0c;color:#ffffff;">AddHead(T t) { </span><span style="background:#100d0c;color:#8ac5ff;">var </span><span style="background:#100d0c;color:#ffffff;">n </span><span style="background:#100d0c;color:#c0c0c0;">= </span><span style="background:#100d0c;color:#8ac5ff;">new </span><span style="background:#100d0c;color:#64b1ff;">Node</span><span style="background:#100d0c;color:#ffffff;">(t) { Next </span><span style="background:#100d0c;color:#c0c0c0;">= </span><span style="background:#100d0c;color:#ffffff;">head }; head </span><span style="background:#100d0c;color:#c0c0c0;">= </span><span style="background:#100d0c;color:#ffffff;">n; } </span><span style="background:#100d0c;color:#8ac5ff;">private class </span><span style="background:#100d0c;color:#64b1ff;">Node </span><span style="background:#100d0c;color:#ffffff;">{ </span><span style="background:#100d0c;color:#8ac5ff;">public </span><span style="background:#100d0c;color:#ffffff;">Node(T t) { Next </span><span style="background:#100d0c;color:#c0c0c0;">= </span><span style="background:#100d0c;color:#8ac5ff;">null</span><span style="background:#100d0c;color:#ffffff;">; Data </span><span style="background:#100d0c;color:#c0c0c0;">= </span><span style="background:#100d0c;color:#ffffff;">t; } </span><span style="background:#100d0c;color:#8ac5ff;">public </span><span style="background:#100d0c;color:#64b1ff;">Node </span><span style="background:#100d0c;color:#ffffff;">Next { </span><span style="background:#100d0c;color:#8ac5ff;">get</span><span style="background:#100d0c;color:#ffffff;">; </span><span style="background:#100d0c;color:#8ac5ff;">set</span><span style="background:#100d0c;color:#ffffff;">; } </span><span style="background:#100d0c;color:#8ac5ff;">public </span><span style="background:#100d0c;color:#ffffff;">T Data { </span><span style="background:#100d0c;color:#8ac5ff;">get</span><span style="background:#100d0c;color:#ffffff;">; </span><span style="background:#100d0c;color:#8ac5ff;">set</span><span style="background:#100d0c;color:#ffffff;">; } } </span><a href="http://11011.net/software/vspaste"></a></p>
<p><span style="background:#100d0c;color:#8ac5ff;">blic </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerator</span><span style="background:#100d0c;color:#c0c0c0;">&lt;</span><span style="background:#100d0c;color:#ffffff;">T</span><span style="background:#100d0c;color:#c0c0c0;">&gt; </span><span style="background:#100d0c;color:#ffffff;">GetEnumerator() </span><span style="background:#100d0c;color:#8ac5ff;">public </span><span style="background:#100d0c;color:#ffffff;">T FindFirstOccurrence(</span><span style="background:#100d0c;color:#8ac5ff;">string </span><span style="background:#100d0c;color:#ffffff;">s) { </span><span style="background:#100d0c;color:#8ac5ff;">var </span><span style="background:#100d0c;color:#ffffff;">current </span><span style="background:#100d0c;color:#c0c0c0;">= </span><span style="background:#100d0c;color:#ffffff;">head; T t </span><span style="background:#100d0c;color:#c0c0c0;">= </span><span style="background:#100d0c;color:#8ac5ff;">null</span><span style="background:#100d0c;color:#ffffff;">; </span><span style="background:#100d0c;color:#8ac5ff;">while </span><span style="background:#100d0c;color:#ffffff;">(current </span><span style="background:#100d0c;color:#c0c0c0;">!= </span><span style="background:#100d0c;color:#8ac5ff;">null</span><span style="background:#100d0c;color:#ffffff;">) </span><span style="background:#100d0c;color:#8ac5ff;">if </span><span style="background:#100d0c;color:#ffffff;">(current</span><span style="background:#100d0c;color:#c0c0c0;">.</span><span style="background:#100d0c;color:#ffffff;">Data</span><span style="background:#100d0c;color:#c0c0c0;">.</span><span style="background:#100d0c;color:#ffffff;">Name </span><span style="background:#100d0c;color:#c0c0c0;">== </span><span style="background:#100d0c;color:#ffffff;">s) { t </span><span style="background:#100d0c;color:#c0c0c0;">= </span><span style="background:#100d0c;color:#ffffff;">current</span><span style="background:#100d0c;color:#c0c0c0;">.</span><span style="background:#100d0c;color:#ffffff;">Data; </span><span style="background:#100d0c;color:#8ac5ff;">break</span><span style="background:#100d0c;color:#ffffff;">; } </span><span style="background:#100d0c;color:#8ac5ff;">else </span><span style="background:#100d0c;color:#ffffff;">current </span><span style="background:#100d0c;color:#c0c0c0;">= </span><span style="background:#100d0c;color:#ffffff;">current</span><span style="background:#100d0c;color:#c0c0c0;">.</span><span style="background:#100d0c;color:#ffffff;">Next; </span><span style="background:#100d0c;color:#8ac5ff;">return </span><span style="background:#100d0c;color:#ffffff;">t; } }</span><a href="http://11011.net/software/vspaste"></a></p>
</div>
</div>
<p>The constraint enables the generic class to use the <span class="code">Employee.Name</span> property</p>
<p>because all items of type T are guaranteed to be either an <span class="code">Employee</span> object or an object that inherits from <span class="code">Employee</span>.</p>
<p>Multiple constraints can be applied to the same type parameter, and the constraints themselves can be generic types, as follows:</p>
<div>
<div id="ctl00_LibFrame_MainContent_ctl12_CSharp" class="libCScode">
<div class="CodeSnippetTitleBar">
<div class="CodeDisplayLanguage"> </div>
</div>
</div>
</div>
</div>
<p><span style="background:#16140f;color:#22bdff;">class </span><span style="background:#16140f;color:#e7d97a;">EmployeeList</span><span style="background:#16140f;color:#c0c0c0;">&lt;</span><span style="background:#16140f;color:#eddfc0;">T</span><span style="background:#16140f;color:#c0c0c0;">&gt; </span><span style="background:#16140f;color:#22bdff;">where </span><span style="background:#16140f;color:#eddfc0;">T </span><span style="background:#16140f;color:#e7696c;">: </span><span style="background:#16140f;color:#eddfc0;">Employee</span><span style="background:#16140f;color:#e7696c;">, </span><span style="background:#16140f;color:#eddfc0;">IEmployee</span><span style="background:#16140f;color:#e7696c;">, </span><span style="background:#16140f;color:#eddfc0;">System</span><span style="background:#16140f;color:#c0c0c0;">.</span><span style="background:#16140f;color:#dde074;">IComparable</span><span style="background:#16140f;color:#c0c0c0;">&lt;</span><span style="background:#16140f;color:#eddfc0;">T</span><span style="background:#16140f;color:#c0c0c0;">&gt;</span><span style="background:#16140f;color:#e7696c;">, </span><span style="background:#16140f;color:#22bdff;">new</span><span style="background:#16140f;color:#e7696c;">() { </span><span style="background:#16140f;color:#7cfc00;">// &#8230; </span><span style="background:#16140f;color:#e7696c;">} </span><a href="http://11011.net/software/vspaste"></a></div>
</div>
</div>
</div>
<p>By constraining the type parameter, you increase the number of allowable operations and</p>
<p>method calls to those supported by the constraining type and all types in its inheritance hierarchy. Therefore, when you design generic classes or methods, if you will be performing any operation on the generic members beyond simple assignment or calling any methods not supported by <strong>System.Object</strong>, you will have to apply constraints to the type parameter.</p>
<p>When applying the <span class="code">where T : class</span> constraint, avoid the <span class="keyword">==</span> and <span class="keyword">!=</span> operators on the type parameter because these operators will test for reference identity only, not for value equality. This is the case even if these operators are overloaded in a type that is used as an argument. The following code illustrates this point; the output is false even though the <a id="ctl00_LibFrame_MainContent_ctl13" href="http://msdn.microsoft.com/en-us/library/system.string.aspx">String</a> class overloads the <span class="keyword">==</span> operator.</p>
<div>
<div id="ctl00_LibFrame_MainContent_ctl14_CSharp" class="libCScode">
<div class="CodeSnippetTitleBar">
<div class="CodeDisplayLanguage">
<div class="CopyCodeButton"><a class="copyCode" href="http://msdn.microsoft.com/"></a></div>
</div>
</div>
</div>
</div>
<p><span style="background:#16140f;color:#22bdff;">public static void </span><span style="background:#16140f;color:#eddfc0;">OpTest</span><span style="background:#16140f;color:#c0c0c0;">&lt;</span><span style="background:#16140f;color:#eddfc0;">T</span><span style="background:#16140f;color:#c0c0c0;">&gt;</span><span style="background:#16140f;color:#e7696c;">(</span><span style="background:#16140f;color:#eddfc0;">T s</span><span style="background:#16140f;color:#e7696c;">, </span><span style="background:#16140f;color:#eddfc0;">T t</span><span style="background:#16140f;color:#e7696c;">) </span><span style="background:#16140f;color:#22bdff;">where </span><span style="background:#16140f;color:#eddfc0;">T </span><span style="background:#16140f;color:#e7696c;">: </span><span style="background:#16140f;color:#22bdff;">class </span><span style="background:#16140f;color:#e7696c;">{ </span></p>
<p><span style="background:#16140f;color:#eddfc0;">       System</span><span style="background:#16140f;color:#c0c0c0;">.</span><span style="background:#16140f;color:#e7d97a;">Console</span><span style="background:#16140f;color:#c0c0c0;">.</span><span style="background:#16140f;color:#eddfc0;">WriteLine</span><span style="background:#16140f;color:#e7696c;">(</span><span style="background:#16140f;color:#eddfc0;">s </span><span style="background:#16140f;color:#c0c0c0;">== </span><span style="background:#16140f;color:#eddfc0;">t</span><span style="background:#16140f;color:#e7696c;">); </span></p>
<p><span style="background:#16140f;color:#e7696c;">}</span></p>
<p><span style="background:#16140f;color:#e7696c;"> </span><span style="background:#16140f;color:#22bdff;">static void </span><span style="background:#16140f;color:#eddfc0;">Main</span><span style="background:#16140f;color:#e7696c;">() {</span></p>
<p><span style="background:#16140f;color:#e7696c;">           </span><span style="background:#16140f;color:#22bdff;">string </span><span style="background:#16140f;color:#eddfc0;">s1 </span><span style="background:#16140f;color:#c0c0c0;">= </span><span style="background:#16140f;color:#a6f0e6;">&#8220;foo&#8221;</span><span style="background:#16140f;color:#e7696c;">;</span></p>
<p><span style="background:#16140f;color:#e7696c;">            var</span><span style="background:#16140f;color:#e7d97a;"> </span><span style="background:#16140f;color:#eddfc0;">sb </span><span style="background:#16140f;color:#c0c0c0;">= </span><span style="background:#16140f;color:#22bdff;">new </span><span style="background:#16140f;color:#eddfc0;">System</span><span style="background:#16140f;color:#c0c0c0;">.</span><span style="background:#16140f;color:#eddfc0;">Text</span><span style="background:#16140f;color:#c0c0c0;">.</span><span style="background:#16140f;color:#e7d97a;">StringBuilder</span><span style="background:#16140f;color:#e7696c;">(</span><span style="background:#16140f;color:#a6f0e6;">&#8220;foo&#8221;</span><span style="background:#16140f;color:#e7696c;">); </span></p>
<p><span style="background:#16140f;color:#22bdff;">            string </span><span style="background:#16140f;color:#eddfc0;">s2 </span><span style="background:#16140f;color:#c0c0c0;">= </span><span style="background:#16140f;color:#eddfc0;">sb</span><span style="background:#16140f;color:#c0c0c0;">.</span><span style="background:#16140f;color:#eddfc0;">ToString</span><span style="background:#16140f;color:#e7696c;">(); </span></p>
<p><span style="background:#16140f;color:#eddfc0;">            OpTest</span><span style="background:#16140f;color:#c0c0c0;">&lt;</span><span style="background:#16140f;color:#22bdff;">string</span><span style="background:#16140f;color:#c0c0c0;">&gt;</span><span style="background:#16140f;color:#e7696c;">(</span><span style="background:#16140f;color:#eddfc0;">s1</span><span style="background:#16140f;color:#e7696c;">, </span><span style="background:#16140f;color:#eddfc0;">s2</span><span style="background:#16140f;color:#e7696c;">); </span></p>
<p><span style="background:#16140f;color:#e7696c;">}</span><a href="http://11011.net/software/vspaste"></a></p>
<p>The reason for this behavior is that, at compile time, the compiler only knows that T is a reference type, and therefore must use the default operators that are valid for all reference types. If you must test for value equality, the recommended way is to also apply the <span class="code">where <strong><em>T : IComparable&lt;T&gt;</em></strong></span> constraint and implement that interface in any class that will be used to construct the generic class.</p>
<div id="ctl00_LibFrame_MainContent_cpe468232" class="MTPS_CollapsibleRegion">
<h2>Unbounded Type Parameters</h2>
<div id="ctl00_LibFrame_MainContent_cpe468232_c" class="MTPS_CollapsibleSection" style="display:block;overflow:visible;width:auto;height:auto;">
<div class="MTPS_CollapsibleSection" style="border-right:medium none;border-top:medium none;display:block;border-left:medium none;border-bottom:medium none;"><a name="sectionToggle1"></a></div>
<p>Type parameters that have no constraints, such as T in public class <span class="code">SampleClass&lt;T&gt;{}</span>, are called unbounded type parameters. Unbounded type parameters have the following rules:</p>
<ul>
<li>The <span class="keyword">!=</span> and <span class="keyword">==</span> operators cannot be used because there is no guarantee that the concrete type argument will support these operators.</li>
<li>They can be converted to and from <strong>System.Object</strong> or explicitly converted to any interface type.</li>
<li>You can compare to <a id="ctl00_LibFrame_MainContent_ctl18" href="http://msdn.microsoft.com/en-us/library/edakx9da.aspx">null</a>. If an unbounded parameter is compared to <span class="keyword">null</span>, the comparison will always return false if the type argument is a value type.</li>
</ul>
</div>
</div>
<div id="ctl00_LibFrame_MainContent_cpe468233" class="MTPS_CollapsibleRegion">
<h2>Naked Type Constraints</h2>
<div id="ctl00_LibFrame_MainContent_cpe468233_c" class="MTPS_CollapsibleSection" style="display:block;overflow:visible;width:auto;height:auto;">
<div class="MTPS_CollapsibleSection" style="border-right:medium none;border-top:medium none;display:block;border-left:medium none;border-bottom:medium none;"><a name="sectionToggle2"></a></div>
<p>When a generic type parameter is used as a constraint, it is called a naked type constraint. Naked type constraints are useful when a member function with its own type parameter has to constrain that parameter to the type parameter of the containing type, as shown in the following example:</p>
<div>
<div id="ctl00_LibFrame_MainContent_ctl23_CSharp" class="libCScode">
<div class="CodeSnippetTitleBar">
<div class="CodeDisplayLanguage">
<div class="CopyCodeButton"><a class="copyCode" href="http://msdn.microsoft.com/"></a></div>
</div>
</div>
</div>
</div>
<p><span style="background:#16140f;color:#22bdff;">class </span><span style="background:#16140f;color:#e7d97a;">List</span><span style="background:#16140f;color:#c0c0c0;">&lt;</span><span style="background:#16140f;color:#eddfc0;">T</span><span style="background:#16140f;color:#c0c0c0;">&gt; </span><span style="background:#16140f;color:#e7696c;">{ </span><span style="background:#16140f;color:#22bdff;">void </span><span style="background:#16140f;color:#eddfc0;">Add</span><span style="background:#16140f;color:#c0c0c0;">&lt;</span><span style="background:#16140f;color:#eddfc0;">U</span><span style="background:#16140f;color:#c0c0c0;">&gt;</span><span style="background:#16140f;color:#e7696c;">(</span><span style="background:#16140f;color:#e7d97a;">List</span><span style="background:#16140f;color:#c0c0c0;">&lt;</span><span style="background:#16140f;color:#eddfc0;">U</span><span style="background:#16140f;color:#c0c0c0;">&gt; </span><span style="background:#16140f;color:#eddfc0;">items</span><span style="background:#16140f;color:#e7696c;">) </span><span style="background:#16140f;color:#22bdff;">where </span><span style="background:#16140f;color:#eddfc0;">U </span><span style="background:#16140f;color:#e7696c;">: </span><span style="background:#16140f;color:#eddfc0;">T </span><span style="background:#16140f;color:#e7696c;">{</span><span style="background:#16140f;color:#7cfc00;">/*&#8230;*/</span><span style="background:#16140f;color:#e7696c;">} }</span><a href="http://11011.net/software/vspaste"></a></div>
</div>
<p>In the previous example, <span class="code">T</span> is a naked type constraint in the context of the <strong>Add</strong> method, and an unbounded type parameter in the context of the <strong>List</strong> class.</p>
<p>Naked type constraints can also be used in generic class definitions. Note that the naked type constraint must also have been declared within the angle brackets together with any other type parameters:</p>
<div>
<div id="ctl00_LibFrame_MainContent_ctl24_CSharp" class="libCScode">
<div class="CodeSnippetTitleBar">
<div class="CodeDisplayLanguage"> </div>
</div>
</div>
</div>
<p><span style="background:#16140f;color:#7cfc00;">//naked type constraint </span></p>
<p><span style="background:#16140f;color:#22bdff;">public class </span><span style="background:#16140f;color:#e7d97a;">SampleClass</span><span style="background:#16140f;color:#c0c0c0;">&lt;</span><span style="background:#16140f;color:#eddfc0;">T</span><span style="background:#16140f;color:#e7696c;">, </span><span style="background:#16140f;color:#eddfc0;">U</span><span style="background:#16140f;color:#e7696c;">, </span><span style="background:#16140f;color:#eddfc0;">V</span><span style="background:#16140f;color:#c0c0c0;">&gt; </span><span style="background:#16140f;color:#22bdff;">where </span><span style="background:#16140f;color:#eddfc0;">T </span><span style="background:#16140f;color:#e7696c;">: </span><span style="background:#16140f;color:#eddfc0;">V </span><span style="background:#16140f;color:#e7696c;">{ } </span><a href="http://11011.net/software/vspaste"></a></p>
<p>The usefulness of naked type constraints with generic classes is very limited because the</p>
<p>compiler can assume nothing about a naked type constraint except that it derives from <strong>System.Object</strong>. Use naked type constraints on generic classes in scenarios in which you want to enforce an inheritance relationship between two type parameters.</p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:34b43783-74be-487f-823e-ab9d0ff9b750" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">Technorati Tags: <a rel="tag" href="http://technorati.com/tags/C%23">C#</a>,<a rel="tag" href="http://technorati.com/tags/Generics">Generics</a>,<a rel="tag" href="http://technorati.com/tags/Linq">Linq</a>,<a rel="tag" href="http://technorati.com/tags/Core+Knowledge">Core Knowledge</a>,<a rel="tag" href="http://technorati.com/tags/Assumed+Knowledge">Assumed Knowledge</a>,<a rel="tag" href="http://technorati.com/tags/Basics">Basics</a>,<a rel="tag" href="http://technorati.com/tags/.NET+2.0">.NET 2.0</a>,<a rel="tag" href="http://technorati.com/tags/Linq+to+Objects">Linq to Objects</a></div>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:037c91cd-c331-49b2-8a03-22b501814b3b" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">del.icio.us Tags: <a rel="tag" href="http://del.icio.us/popular/C%23">C#</a>,<a rel="tag" href="http://del.icio.us/popular/Generics">Generics</a>,<a rel="tag" href="http://del.icio.us/popular/Linq">Linq</a>,<a rel="tag" href="http://del.icio.us/popular/Core+Knowledge">Core Knowledge</a>,<a rel="tag" href="http://del.icio.us/popular/Assumed+Knowledge">Assumed Knowledge</a>,<a rel="tag" href="http://del.icio.us/popular/Basics">Basics</a>,<a rel="tag" href="http://del.icio.us/popular/.NET+2.0">.NET 2.0</a>,<a rel="tag" href="http://del.icio.us/popular/Linq+to+Objects">Linq to Objects</a></div>
<p>Burak Emir1, Andrew Kennedy2, Claudio Russo2, and Dachuan Yu3</p>
<p>1 EPFL, Lausanne, Switzerland</p>
<p>2 Microsoft Research, Cambridge, U.K.</p>
<p>3 DoCoMo Communications Laboratories USA, San Jose, California</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/365/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/365/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/365/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/365/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/365/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/365/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/365/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/365/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/365/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/365/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/365/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/365/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=365&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/06/27/master-generic-type-constrains-a-critical-success-factor-in-linq-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>
	</item>
	</channel>
</rss>