<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://footheory.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Bennie&amp;#39;s Weblog</title><subtitle type="html" /><id>http://footheory.com/blogs/bennie/atom.aspx</id><link rel="alternate" type="text/html" href="http://footheory.com/blogs/bennie/default.aspx" /><link rel="self" type="application/atom+xml" href="http://footheory.com/blogs/bennie/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20611.960">Community Server</generator><updated>2007-08-02T23:05:43Z</updated><entry><title>Investigating the new Spatial Types in SQL Server 2008 - Part 2</title><link rel="alternate" type="text/html" href="http://footheory.com/blogs/bennie/archive/2008/10/08/investigating-the-new-spatial-type-in-sql-server-2008-part-2.aspx" /><id>http://footheory.com/blogs/bennie/archive/2008/10/08/investigating-the-new-spatial-type-in-sql-server-2008-part-2.aspx</id><published>2008-10-08T19:32:51Z</published><updated>2008-10-08T19:32:51Z</updated><content type="html">&lt;h3&gt;&lt;/h3&gt;  &lt;h3&gt;Introduction&lt;/h3&gt;  &lt;p&gt;In the &lt;a href="http://footheory.com/blogs/bennie/archive/2008/10/05/investigating-the-new-spatial-types-in-sql-server-2008-part-1.aspx"&gt;previous part&lt;/a&gt; of this series, we talked about the importance of spatial data in our everyday lives. We talked about vector and raster data, and we explained that the current version of SQL Server 2008 focuses on two-dimensional vector data. Next, we introduced the new &lt;strong&gt;geography&lt;/strong&gt; and &lt;strong&gt;geometry&lt;/strong&gt; data types in SQL server 2008, and we took a quick detour into some important object-oriented principles.&lt;/p&gt;  &lt;p&gt;In this article, we start out by taking a look at the class hierarchies for both the geometry and the geography data types in SQL Server 2008. We will focus on the concrete classes in the class diagram which are:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;font size="2" face="tahom"&gt;Point.&amp;#160; &lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font size="2" face="tahom"&gt;LineString &lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font size="2" face="tahom"&gt;Polygon&lt;/font&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;We will also take a look at the collection classes in the object hierarchy, which allow us to store multiple instances of each type.&lt;/p&gt;  &lt;p&gt;Once we have a good grasp on the geometry and geography class hierarchy we will dive into the details of each concrete class. We will start our investigation by looking into the details of the &lt;font size="2" face="Courier New"&gt;Point&lt;/font&gt; and &lt;font size="2" face="Courier New"&gt;LineString&lt;/font&gt; class, and we will write a T-SQL script that highlights the most important features. In the process we will take a look at the three different data formats that can be used to represent spatial data:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;The Well-Known-Binary&amp;#160; (&lt;a href="http://edndoc.esri.com/arcsde/9.0/general_topics/wkb_representation.htm"&gt;WKB&lt;/a&gt;) format &lt;/li&gt;    &lt;li&gt;The Well-Known-Text (&lt;a href="http://en.wikipedia.org/wiki/Well-known_text"&gt;WKT&lt;/a&gt;) format &lt;/li&gt;    &lt;li&gt;The Geography Markup Language (&lt;a href="http://en.wikipedia.org/wiki/Geography_Markup_Language"&gt;GML&lt;/a&gt;) data format. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;All of these formats are published as a standard by the Open Geospatial Consortium (&lt;a href="http://www.opengeospatial.org/"&gt;OGC&lt;/a&gt;), which is the leading standards body for geospatial and location based services.&lt;/p&gt;  &lt;h3&gt;The Geometry class hierarchy&lt;/h3&gt;  &lt;h4&gt;Overview&lt;/h4&gt;  &lt;p&gt;A class diagram showing the &lt;font size="2" face="Courier New"&gt;Geometry&lt;/font&gt; class and all of its sub-classes is shown below (note that the &lt;font size="2" face="Courier New"&gt;Geography&lt;/font&gt; class diagram is basically identical, with the &lt;font size="2" face="Courier New"&gt;Geography&lt;/font&gt; class at the root of the tree):&lt;/p&gt;  &lt;p&gt;&lt;a title="Geometry Class Diagram" href="http://www.flickr.com/photos/99548241@N00/2918867849/"&gt;&lt;img border="0" alt="Geometry Class Diagram" src="http://static.flickr.com/3202/2918867849_6193d71671.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The darker-blue shaded classes are abstract base classes, so they cannot be directly instantiated in the database engine. The light-blue shaded classes are the concrete classes that we can use directly in our T-SQL code:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;font size="2" face="Courier New"&gt;Point&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size="2" face="Courier New"&gt;LineString&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size="2" face="Courier New"&gt;Polygon&lt;/font&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Each of these single-instance classes has a collection equivalent that can contain multiple instances:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;MultiPoint&lt;/font&gt;&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size="2" face="Courier New"&gt;MultiLineString&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size="2" face="Courier New"&gt;MultiPolygon&lt;/font&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The &lt;font size="2" face="Courier New"&gt;GeomCollection&lt;/font&gt; class is an additional collection class that can contain a mixture of instances of any type (&lt;font size="2" face="Courier New"&gt;Points&lt;/font&gt;, &lt;font size="2" face="Courier New"&gt;LineStrings&lt;/font&gt; and &lt;font size="2" face="Courier New"&gt;Polygons&lt;/font&gt;).&lt;/p&gt;  &lt;h4&gt;Supported Data Formats&lt;/h4&gt;  &lt;p&gt;All of the classes in the &lt;font size="2" face="Courier New"&gt;geometry&lt;/font&gt; and the &lt;font size="2" face="Courier New"&gt;geography&lt;/font&gt; class hierarchy can be represented by three different formats:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;The Well-Known Binary (&lt;a href="http://edndoc.esri.com/arcsde/9.0/general_topics/wkb_representation.htm"&gt;WKB&lt;/a&gt;) format&lt;/strong&gt;. This is a byte-stream (binary) representation for a geography instance. This format is the preferred serialization format for those applications that need to store geospatial information in a compact, self-contained format.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;The Well-Known Text (&lt;a href="http://en.wikipedia.org/wiki/Well-known_text"&gt;WKT&lt;/a&gt;) format.&lt;/strong&gt; This is a compact, easy to read representation. Because of its user-friendly format it is the most commonly used representation for ad-hoc geospatial queries. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;The Geography Markup Language (&lt;a href="http://en.wikipedia.org/wiki/Geography_Markup_Language"&gt;GML&lt;/a&gt;) format&lt;/strong&gt;. This is an XML-based representation, which is best suited for including geospatial information in an XML document. This format is very useful for those applications that need to exchange geospatial information by means of an XML Web service. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;All of the above formats are published as standards by the &lt;a href="http://www.opengeospatial.org/"&gt;OGC&lt;/a&gt;. In the code samples that follow, we will be showing multiple examples of each format.&lt;/p&gt;  &lt;h4&gt;The Point Class&lt;/h4&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;h5&gt;Basic Representation&lt;/h5&gt;  &lt;p&gt;A &lt;font size="2" face="Courier New"&gt;Point&lt;/font&gt; is a zero-dimensional object which represents a single, exact location. It always contains an X and Y coordinate, and can optionally can contain a Z (elevation) value, and a M (measure) value. The measure value is an arbitrary floating point measurement value that you can associate with the &lt;font size="2" face="Courier New"&gt;Point &lt;/font&gt;instance.&lt;/p&gt;  &lt;p&gt;The sample &lt;font size="2" face="tah"&gt;T-SQL script (&lt;font face="Courier New"&gt;GeometryPoint.sql)&lt;/font&gt;illustrates some&lt;/font&gt; of the capabilities of the &lt;font size="2" face="Courier New"&gt;Point&lt;/font&gt; class. Throughout all of our demos, we will be working with a very simple table called &lt;font size="2" face="Courier New"&gt;GeometryDemo&lt;/font&gt;, which allows us to associate a Geometry instance with an integer ID: &lt;/p&gt;  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;   &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;CREATE&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;TABLE&lt;/span&gt; GeometryDemo&lt;/pre&gt;

  &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; (&lt;/pre&gt;

  &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     ID    &lt;span style="color:#0000ff;"&gt;INT&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;NOT&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;NULL&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;Value&lt;/span&gt; GEOMETRY &lt;span style="color:#0000ff;"&gt;NOT&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;NULL&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; );&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;In the following code sample, we insert a &lt;font size="2" face="Courier New"&gt;Point&lt;/font&gt; instance, and then perform a &lt;font size="2" face="Courier New"&gt;select&lt;/font&gt; to retrieve the point instance in a number of formats:&lt;/p&gt;

&lt;div&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;-- Insert a simple Point with an&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#008000;"&gt;-- X and Y coordinate&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; INSERT &lt;span style="color:#0000ff;"&gt;INTO&lt;/span&gt; GeometryDemo (ID, &lt;span style="color:#0000ff;"&gt;Value&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;VALUES&lt;/span&gt;    (1, &lt;span style="color:#006080;"&gt;&amp;#39;POINT(50 65)&amp;#39;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt; &lt;span style="color:#008000;"&gt;-- Get the X and Y coordinates and &lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt; &lt;span style="color:#008000;"&gt;-- the most relevant methods&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; ID, &lt;span style="color:#0000ff;"&gt;Value&lt;/span&gt;.ToString() &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; WKT, &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;            &lt;span style="color:#0000ff;"&gt;Value&lt;/span&gt;.STX &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [X Coordinate],                        &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;            &lt;span style="color:#0000ff;"&gt;Value&lt;/span&gt;.STY &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Y Coordinate],&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;            &lt;span style="color:#0000ff;"&gt;Value&lt;/span&gt;.STAsBinary() &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; [&lt;span style="color:#0000ff;"&gt;Binary&lt;/span&gt; Representation],&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;            &lt;span style="color:#0000ff;"&gt;Value&lt;/span&gt;.STasText() &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; [Text Representation]&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; GeometryDemo&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;WHERE&lt;/span&gt; ID = 1;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;In lines 3 and 4, we use the WKT format to insert a &lt;font size="2" face="Courier New"&gt;Point&lt;/font&gt; with an X coordinate of 50 and a Y coordinate of 65. The WKT format for a &lt;font size="2" face="Courier New"&gt;Point&lt;/font&gt; simply requires you to to specify the X and Y coordinates. Note that you should NOT use a comma separator between the two, which might seem counterintuitive at first.&lt;/p&gt;

&lt;p&gt;In lines 8 through 14 we select the instance that we just inserted. Since &lt;font size="2" face="Courier New"&gt;Value&lt;/font&gt; is a geometry class instance, we need to use the&amp;#160; dot (&amp;quot;.&amp;quot;) notation to access properties and invoke methods on the object:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;In line 8 we invoke the &lt;font size="2" face="Courier New"&gt;ToString()&lt;/font&gt; method. This method will return the Well-Known Text (WKT) representation of the instance. &lt;/li&gt;

  &lt;li&gt;In lines 9 and 10 we invoke the &lt;font size="2" face="Courier New"&gt;STX&lt;/font&gt; and &lt;font size="2" face="Courier New"&gt;STY&lt;/font&gt; properties to get the X and Y coordinates of our &lt;font size="2" face="Courier New"&gt;Point.&lt;/font&gt; &lt;/li&gt;

  &lt;li&gt;In line 11 we invoke the &lt;font size="2" face="Courier New"&gt;STAsBinary()&lt;/font&gt; method to get the binary representation of the &lt;font size="2" face="Courier New"&gt;Point&lt;/font&gt;. &lt;/li&gt;

  &lt;li&gt;Finally, in line 12 we invoke the &lt;font size="2" face="Courier New"&gt;STAsText()&lt;/font&gt; method, which will again return the WKT format of the &lt;font size="2" face="Courier New"&gt;Point.&lt;/font&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One important note: although TSQL by itself is not case sensitive, the CLR methods and properties on the spatial data types are, so make sure that you spell the property and method names correctly! For example if you would spell &amp;quot;&lt;font size="2" face="courier ne"&gt;Value.STAsText()&amp;quot;&lt;/font&gt; as &amp;quot;&lt;font size="2" face="Courier New"&gt;Value.STasText()&amp;quot;&lt;/font&gt; you would get the following error message:&lt;/p&gt;

&lt;div&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; Msg 6506, &lt;span style="color:#0000ff;"&gt;Level&lt;/span&gt; 16, &lt;span style="color:#0000ff;"&gt;State&lt;/span&gt; 10, Line 34&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; Could &lt;span style="color:#0000ff;"&gt;not&lt;/span&gt; find method &lt;span style="color:#006080;"&gt;&amp;#39;STasText&amp;#39;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; type &lt;span style="color:#006080;"&gt;&amp;#39;Microsoft.SqlServer.Types.SqlGeometry&amp;#39;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; assembly &lt;span style="color:#006080;"&gt;&amp;#39;Microsoft.SqlServer.Types&amp;#39;&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
The output of the select query is shown below:&lt;/div&gt;

&lt;p&gt;&lt;a title="OutputSimplePoint" href="http://www.flickr.com/photos/99548241@N00/2919284043/"&gt;&lt;img border="0" alt="OutputSimplePoint" src="http://static.flickr.com/3004/2919284043_bdd89474de.jpg" width="725" height="83" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the above output, we see that the WKT representation for the &lt;font size="2" face="Courier New"&gt;Point &lt;/font&gt;is returned by both the &lt;font size="2" face="Courier New"&gt;ToString()&lt;/font&gt; and the &lt;font size="2" face="Courier New"&gt;STAsText()&lt;/font&gt; methods. We also see the binary WKB representation and the X and Y coordinates of the &lt;font size="2" face="Courier New"&gt;Point &lt;/font&gt;instance.&lt;/p&gt;

&lt;h5&gt;Using the Z and M coordinates&lt;/h5&gt;

&lt;p&gt;As we mentioned earlier, a Point can optionally contain a Z (Elevation) coordinate and a M (Measurement) value. Note that both the Z and M values should be floats. Below is a T-SQL example:&lt;/p&gt;

&lt;div&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;-- Insert a Point with an X, Y, Z and&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#008000;"&gt;-- M coordinate&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; INSERT &lt;span style="color:#0000ff;"&gt;INTO&lt;/span&gt; GeometryDemo (ID, &lt;span style="color:#0000ff;"&gt;Value&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;VALUES&lt;/span&gt; (2, &lt;span style="color:#006080;"&gt;&amp;#39;POINT(55 70 100.2 50)&amp;#39;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; ID, &lt;span style="color:#0000ff;"&gt;Value&lt;/span&gt;.ToString() &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; WKT, &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;            &lt;span style="color:#0000ff;"&gt;Value&lt;/span&gt;.STX &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [X Coordinate],                        &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;            &lt;span style="color:#0000ff;"&gt;Value&lt;/span&gt;.STY &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Y Coordinate],&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;            &lt;span style="color:#0000ff;"&gt;Value&lt;/span&gt;.Z &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Elevation],&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;            &lt;span style="color:#0000ff;"&gt;Value&lt;/span&gt;.M &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Measure]&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; GeometryDemo&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;WHERE&lt;/span&gt; ID = 2;&lt;/pre&gt;
  &lt;/div&gt;
As you can see, we simply added the Z and M values in the WKT format. The output of the select query is shown below:&lt;/div&gt;

&lt;p&gt;&lt;a title="OutputAdvancedPoint2" href="http://www.flickr.com/photos/99548241@N00/2920160158/"&gt;&lt;img border="0" alt="OutputAdvancedPoint2" src="http://static.flickr.com/3211/2920160158_0e78117127.jpg" width="571" height="85" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;&lt;/h5&gt;

&lt;h5&gt;OGC-compliant methods and Microsoft Extensions&lt;/h5&gt;

&lt;p&gt;The attentive observer probably noticed that some method and properties have an &lt;strong&gt;ST&lt;/strong&gt; prefix (such as &lt;font size="2" face="Courier New"&gt;STX&lt;/font&gt;, &lt;font size="2" face="courier n"&gt;STY&lt;/font&gt; and &lt;font size="2" face="Courier New"&gt;STAsText()&lt;/font&gt;), while other properties and methods do NOT have this prefix (for example: &lt;font size="2" face="Courier New"&gt;Z&lt;/font&gt;, &lt;font size="2" face="Courier New"&gt;M&lt;/font&gt; and &lt;font size="2" face="Courier New"&gt;ToString()&lt;/font&gt;). All methods and properties that are prefixed with &lt;strong&gt;ST&lt;/strong&gt; are OGC-compliant methods, while the other methods and properties are Microsoft extensions to the OGC standard.&lt;/p&gt;

&lt;p&gt;In the documentation you will notice that the OGC standard methods and the Microsoft extensions are cleanly separated:&lt;/p&gt;

&lt;p&gt;&lt;a title="OGCMethodsAndExtensions" href="http://www.flickr.com/photos/99548241@N00/2941793987/"&gt;&lt;img border="0" alt="OGCMethodsAndExtensions" src="http://static.flickr.com/3156/2941793987_a96dac7eba.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the above diagram we also see sections for static methods (both OGC and Microsoft extensions). We will take a look at static methods in a later section of this post.&lt;/p&gt;

&lt;h5&gt;Geography Markup Language (GML)&lt;/h5&gt;

&lt;p&gt;The only format that we have not worked with so far is the Geographic Markup Language (GML), let&amp;#39;s write a query to retrieve both points as GML:&lt;/p&gt;

&lt;div&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;--    Select both Points as GML&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#008000;"&gt;--  Note that we are NOT retrieving the Z and M&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; &lt;span style="color:#008000;"&gt;--  coordinates of the second point&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; &lt;span style="color:#008000;"&gt;--  because they are NOT OGC compliant!&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; ID, &lt;span style="color:#0000ff;"&gt;Value&lt;/span&gt;.AsGml() &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; [GML]&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; GeometryDemo;&lt;/pre&gt;
  &lt;/div&gt;
The &lt;font size="2" face="Courier New"&gt;AsGml()&lt;/font&gt; method can be used to retrieve a geometry instance in GML format. &lt;/div&gt;

&lt;p&gt;The output of the query is shown below:&lt;/p&gt;

&lt;p&gt;&lt;a title="OutputPointGML" href="http://www.flickr.com/photos/99548241@N00/2920194036/"&gt;&lt;img border="0" alt="OutputPointGML" src="http://static.flickr.com/3195/2920194036_69a4f0766f.jpg" width="553" height="107" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The standard XML namespace for GML will have the URN: &lt;a href="http://www.opengis.net/gml"&gt;http://www.opengis.net/gml&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;There is also one important note that we can make from the above output: the &lt;font size="2" face="Courier New"&gt;Z&lt;/font&gt; and &lt;font size="2" face="Courier New"&gt;M&lt;/font&gt; coordinates that we used for the second point are NOT returned in the GML! That is because they are proprietary Microsoft extensions to the OGC standard.&lt;/p&gt;

&lt;h5&gt;Using the static Point methods&lt;/h5&gt;

&lt;p&gt;The methods and properties we have used so far were invoked on an instance of the Point class, so we used the &amp;quot;dot&amp;quot; (.) notation:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;instanceName.Property &lt;/font&gt;&lt;/p&gt;

  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;-or-&lt;/font&gt;&lt;/p&gt;

  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;instanceName.MethodCall(... method arguments here ...)&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instance properties and methods are always tied to a particular object &lt;strong&gt;instance&lt;/strong&gt;, in this case a Point instance. Besides instance methods, the spatial data types in SQL Server 2008 also use static methods and properties. Static methods and properties are tied to the &lt;strong&gt;class&lt;/strong&gt; itself, and can thus be invoked without having an instance around. You use the &amp;quot;::&amp;quot; notation in combination with the class name to invoke a static method or property in T-SQL:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;className::Property&lt;/font&gt;&lt;/p&gt;

  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;-or-&lt;/font&gt;&lt;/p&gt;

  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;className::MethodCall()&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One frequent usage pattern for a static method is the Factory Pattern. The Factory Pattern returns a new instance of the class through a static method. This pattern is used in both geospatial types in SQL Server 2008. Below is a code example from the &lt;font size="2" face="Courier New"&gt;GeometryPoint.sql&lt;/font&gt; T-SQL script:&lt;/p&gt;

&lt;div&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; /* ========================================================================= &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;    ======= &lt;span style="color:#0000ff;"&gt;Using&lt;/span&gt; the &lt;span style="color:#0000ff;"&gt;Static&lt;/span&gt; methods &lt;span style="color:#0000ff;"&gt;to&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;create&lt;/span&gt; a Point Instance =============&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;    ========================================================================= */&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DECLARE&lt;/span&gt; @Pnt1 Geometry, @Pnt2 Geometry, @Pnt3 Geometry, @Pnt4 Geometry, @Pnt5 Geometry&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DECLARE&lt;/span&gt; @xmlSnippet xml;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt; &lt;span style="color:#008000;"&gt;--    1. Create a Point from an X and Y coordinate and an SRID&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; @Pnt1 = geometry::Point(30, 20, 0);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt; &lt;span style="color:#008000;"&gt;-- 2. Create a Point using the Parse method&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; @Pnt2 = geometry::Parse(&lt;span style="color:#006080;"&gt;&amp;#39;POINT( 90 23 56000 231)&amp;#39;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt; &lt;span style="color:#008000;"&gt;-- 3. Create a Point using the OGC STPointFromText method&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt; &lt;span style="color:#008000;"&gt;-- Notice the SRID at the end&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; @Pnt3 = geometry::STPointFromText(&lt;span style="color:#006080;"&gt;&amp;#39;POINT(20 25)&amp;#39;&lt;/span&gt;, 0)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt; &lt;span style="color:#008000;"&gt;-- 4. Create a Point from GML &lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; @xmlSnippet = &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;     &lt;span style="color:#006080;"&gt;&amp;#39;&amp;lt;Point xmlns=&amp;quot;http://www.opengis.net/gml&amp;quot;&amp;gt; &amp;lt;pos&amp;gt;34 23&amp;lt;/pos&amp;gt; &amp;lt;/Point&amp;gt;&amp;#39;&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  20:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; @Pnt4 = geometry::GeomFromGml(@xmlSnippet, 0);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  21:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  22:&lt;/span&gt; &lt;span style="color:#008000;"&gt;-- 5. Null Point&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  23:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; @Pnt5 = geometry::[&lt;span style="color:#0000ff;"&gt;Null&lt;/span&gt;];&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  24:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  25:&lt;/span&gt; &lt;span style="color:#008000;"&gt;-- Now select all points&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  26:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; @Pnt1.ToString() &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [&lt;span style="color:#0000ff;"&gt;From&lt;/span&gt; Arguments],&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  27:&lt;/span&gt;        @Pnt2.ToString() &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [&lt;span style="color:#0000ff;"&gt;From&lt;/span&gt; Parse],&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  28:&lt;/span&gt;        @Pnt3.ToString() &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; [&lt;span style="color:#0000ff;"&gt;From&lt;/span&gt; STPointFromText],&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  29:&lt;/span&gt;        @Pnt4.ToString() &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [&lt;span style="color:#0000ff;"&gt;From&lt;/span&gt; Xml],&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  30:&lt;/span&gt;        @Pnt5 &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [&lt;span style="color:#0000ff;"&gt;Null&lt;/span&gt; Point];&lt;/pre&gt;
  &lt;/div&gt;
Following is a discussion of each static method:&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;In line 8, we use the static &lt;font size="2" face="Courier New"&gt;geometry::Point()&lt;/font&gt; method to create a Point instance by passing in the X, Y, Z and M coordinates. &lt;/li&gt;

  &lt;li&gt;In line 11, we use the &lt;font size="2" face="Courier New"&gt;geometry::Parse()&lt;/font&gt; method to create a Point instance from Well-Known Text (WKT). &lt;/li&gt;

  &lt;li&gt;In line 15, we use the &lt;font size="2" face="Courier New"&gt;geometry::STPointFromText()&lt;/font&gt; method to create a Point instance from Well-Known Text. The is the OGC equivalent of the &lt;font size="2" face="Courier New"&gt;geometry::Parse()&lt;/font&gt; method. &lt;/li&gt;

  &lt;li&gt;In line 18, we have an example of how to create a Point instance from a Geographic Markup Language (GML) snippet, using the static &lt;font size="2" face="Courier New"&gt;geometry::GeomFromGml()&lt;/font&gt; method. &lt;/li&gt;

  &lt;li&gt;Finally, in line 23 we create a &lt;font size="2" face="Courier New"&gt;NULL&lt;/font&gt; Point instance with the static &lt;font size="2" face="Courier New"&gt;geometry::[Null]&lt;/font&gt; property. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The output of the select statement is shown below:&lt;/p&gt;

&lt;p&gt;&lt;a title="StaticPointMethods" href="http://www.flickr.com/photos/99548241@N00/2941817723/"&gt;&lt;img border="0" alt="StaticPointMethods" src="http://static.flickr.com/3013/2941817723_30bfba9626.jpg" width="544" height="44" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we can conclude from the above output, the expected Point instances were created by means of the static methods.&lt;/p&gt;

&lt;h5&gt;The Spatial Reference Identifier&lt;/h5&gt;

&lt;p&gt;In the previous code sample, you might have noticed the &amp;quot;0&amp;quot; after the &lt;font size="2" face="Courier New"&gt;@xmlSnippet&lt;/font&gt; parameter:&lt;/p&gt;

&lt;div&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; @xmlSnippet = &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color:#006080;"&gt;&amp;#39;&amp;lt;Point xmlns=&amp;quot;http://www.opengis.net/gml&amp;quot;&amp;gt; &amp;lt;pos&amp;gt;34 23&amp;lt;/pos&amp;gt; &amp;lt;/Point&amp;gt;&amp;#39;&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; @Pnt4 = geometry::GeomFromGml(@xmlSnippet, 0);&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This argument is the SRID, or the Spatial Reference Identifier. The SRID corresponds to a spatial reference system based upon the specific ellipsoid used for either flat-earth or round-earth mapping. Different projection systems exist, some of you might be familiar with the Mercator Projection that was used to create the maps that were in most classrooms in recent times. A good discussion of map projections can be found at: &lt;a title="http://maps.unomaha.edu/Peterson/gis/notes/MapProjCoord.html" href="http://maps.unomaha.edu/Peterson/gis/notes/MapProjCoord.html"&gt;http://maps.unomaha.edu/Peterson/gis/notes/MapProjCoord.html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Each projection is uniquely defined by its own SRID. You can use any projection you want, but you need to be aware that when you are comparing spatial instances using any of the methods (such as &lt;font size="2" face="Courier New"&gt;STIntersection()&lt;/font&gt;) you need to make sure that all objects have the &lt;strong&gt;same&lt;/strong&gt; SRID otherwise you will get a run-time error!&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;That concludes part 2 of this series. In part three, we take a look at the LineString and the Polygon class, and we will use some visualization tools such as &lt;a href="http://www.conceptdevelopment.net/Database/Geoquery/"&gt;GeoQuery&lt;/a&gt;, &lt;a href="http://www.codeplex.com/SpatialViewer"&gt;Spatial Viewer&lt;/a&gt;, and SQL Server Management Studio&amp;#39;s very own &amp;quot;Spatial Tab&amp;quot; to get a visual representation of our spatial data!&lt;/p&gt;&lt;img src="http://footheory.com/aggbug.aspx?PostID=415" width="1" height="1"&gt;</content><author><name>bennie</name><uri>http://footheory.com/members/bennie.aspx</uri></author><category term="SQL Server 2008" scheme="http://footheory.com/blogs/bennie/archive/tags/SQL+Server+2008/default.aspx" /><category term="Spatial Data" scheme="http://footheory.com/blogs/bennie/archive/tags/Spatial+Data/default.aspx" /><category term="SQL Server" scheme="http://footheory.com/blogs/bennie/archive/tags/SQL+Server/default.aspx" /><category term="TSQL" scheme="http://footheory.com/blogs/bennie/archive/tags/TSQL/default.aspx" /></entry><entry><title>Investigating the new Spatial Types in SQL Server 2008 - Part 1</title><link rel="alternate" type="text/html" href="http://footheory.com/blogs/bennie/archive/2008/10/05/investigating-the-new-spatial-types-in-sql-server-2008-part-1.aspx" /><id>http://footheory.com/blogs/bennie/archive/2008/10/05/investigating-the-new-spatial-types-in-sql-server-2008-part-1.aspx</id><published>2008-10-05T22:32:05Z</published><updated>2008-10-05T22:32:05Z</updated><content type="html">&lt;h2&gt;&lt;/h2&gt;  &lt;h4&gt;Series Abstract&lt;/h4&gt;  &lt;p&gt;In this post we take a look at the new spatial data type support in SQL server 2008. First, I will make a case for why you would want to integrate spatial support in your applications. Next we will take a look at the two core spatial data types in SQL Server:&amp;#160; the &lt;strong&gt;Geometry&lt;/strong&gt; and &lt;strong&gt;Geography&lt;/strong&gt; types. We will explain when to use each type, and we will take a look at the main application domains for the two types.&lt;/p&gt;  &lt;p&gt;The spatial types are implemented as CLR types in the database engine. Since some database folks might be unfamiliar with CLR types, we will make a brief detour into SQL Server and CLR types. We will talk about the differences between static and instance methods, and explain the TSQL calling notation for each.&lt;/p&gt;  &lt;p&gt;Both the Geometry and the Geography types are really just the top-level types of a rich object hierarchy. We will take a detailed look at the different classes in this hierarchy, and we will explore the methods and properties of each class by means of a number of TSQL scripts. A part of this exploration we will take a look at the three data formats that can be used to represent the spatial types: the SQL Server-native&amp;#160; Well-Know-Binary (WKB) format, and the &lt;a href="http://www.opengeospatial.org/"&gt;OGC&lt;/a&gt; standard data types: the Well-Known-Text (WKT) and the Geography Markup Language (&lt;a href="http://en.wikipedia.org/wiki/Geography_Markup_Language"&gt;GML&lt;/a&gt;) . We will use TSQL scripts for each object to illustrate the different notations.&lt;/p&gt;  &lt;p&gt;As always, a picture is worth a thousand words, and nowhere this is more the case as for spatial information. Therefore, I will use both the &amp;quot;Spatial Results&amp;quot; tab in SQL server and a number of third-party rendering tools such as &lt;a href="http://www.codeplex.com/SpatialViewer"&gt;SpatialViewer&lt;/a&gt; and &lt;a href="http://www.conceptdevelopment.net/Database/Geoquery/"&gt;GeoQuery&lt;/a&gt; to present a spatial query result.&lt;/p&gt;  &lt;p&gt;After we have a good understanding of the spatial data types, we will put them to some practical use. We will use Virtual Earth to create applications in which we create mashups of Spatial data with a variety of business data. A large volume of GIS data is available on the public domain (some good sources are the &lt;a href="http://www.census.gov/"&gt;US Census&lt;/a&gt; and &lt;a href="http://www.usgs.gov/"&gt;USGS&lt;/a&gt; Web sites), but the format of this data is typically not compatible with SQL Server. Therefore, as part of this series we will create a library that will enable us to convert the &amp;quot;traditional&amp;quot; formats into a SQL Server 2008-compatible format.&lt;/p&gt;  &lt;p&gt;The above abstract covers a wide variety of formats, therefore I am planing to spread out this article over a number of different posts. This first post will cover the need for spatial support in our applications, the basics of the Geometry and Geography data types and a quick OO primer.&lt;/p&gt;  &lt;h4&gt;Why Spatial Data?&lt;/h4&gt;  &lt;p&gt;These days it is hard to find any data that DOES NOT have a spatial aspect. A number of applications attempt to answer questions like the following:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Where are my customers located? &lt;/li&gt;    &lt;li&gt;What cities have the highest accident rates? &lt;/li&gt;    &lt;li&gt;What Florida counties have the highest flood risk? (OK, that one&amp;#39;s easy to answer: &amp;quot;All of them&amp;quot;!) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;As GPS devices become more prevalent, more and more data is geo-tagged. For example, a lot of modern mobile phones have both a camera and a GPS chip build in.&lt;/p&gt;  &lt;p&gt;While the above applications use spatial data only as part of their overall data set, there are a number of applications that use mapping and spatial data as their primary output:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Consumer products such as Microsoft&amp;#39;s Virtual Earth or Google maps. &lt;/li&gt;    &lt;li&gt;The government publishes the census results as spatial data. &lt;/li&gt;    &lt;li&gt;Utilities use mapping tools such as ESRI Server to plot the layout of electrical grid lines or underground gas lines. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;While the above examples are pretty self-evident, spatial data also plays an import role in applications that we might not think about right away:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;When a warehousing application generates a pallet &amp;quot;pick run&amp;quot;, it will use geospatial information to calculate the most optimal route. &lt;/li&gt;    &lt;li&gt;When an interior architect uses a CAD tool such as AutoDesk to perform modeling of an interior space, he/she is using spatial data quite extensively. &lt;/li&gt;    &lt;li&gt;Computer-aided manufacturing tools use spatial data to layout out parts on a piece of sheet metal. &lt;/li&gt;    &lt;li&gt;The program in a municipal kiosk uses spatial data and geometric algorithms to predict the arrival times of buses and trains. &lt;/li&gt;    &lt;li&gt;A multi-player computer game use spatial coordinates to keep track of the current locations of all game participants. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;From the above discussion it is clear that a large number of application have a need to work with spatial data. Some common requirements for spatial data support are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The ability to store spatial coordinates directly in the database, preferably in the same tables as its associated data. &lt;/li&gt;    &lt;li&gt;The data types used for this spatial data should go beyond simple point coordinates. Most geospatial data consists out of a mixture of points, lines (both single-segment and multi segment), and closed shapes (typically referred to as polygons in the literature). &lt;/li&gt;    &lt;li&gt;The ability to perform a multitude of operations on this geospatial data. For example, a chip design application might want to assure that certain routes on a chip do not cross, other applications will have a need to calculate the area of a complex polygon etc. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In the next section will take a look at how SQL Server 2008 addresses the above requirements.&lt;/p&gt;  &lt;h4&gt;Spatial Data Support in SQL Server 2008&lt;/h4&gt;  &lt;h5&gt;Types of Spatial Data&lt;/h5&gt;  &lt;p&gt;At the highest level, we recognize two major classes of spatial data:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Vector Data&lt;/strong&gt;. Vector data is data expressed by a set of vertices and their relationship to one another. Common spatial features represented by vector data include:       &lt;ul&gt;       &lt;li&gt;Points. &lt;/li&gt;        &lt;li&gt;Lines (where a line can have one or more segments) &lt;/li&gt;        &lt;li&gt;Polygons. Polygons are typically used to represent areas and regions. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Raster Data&lt;/strong&gt;. Raster data is data expressed as a matrix of cells. We typically recognize raster data as images. Within a spatial or GIS context, we see raster data manifested as:       &lt;ul&gt;       &lt;li&gt;Satellite images. &lt;/li&gt;        &lt;li&gt;The Virtual Earth bird&amp;#39;s eye images. &lt;/li&gt;        &lt;li&gt;Google &amp;quot;street level&amp;quot; images. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;An example of each type of spatial data is shown below&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;p&gt;&lt;u&gt;&lt;strong&gt;Sample Raster Image &lt;/strong&gt;&lt;/u&gt;&lt;u&gt;&lt;strong&gt;(a sample satellite heat map)&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;&lt;u&gt;&lt;strong&gt;Sample Vector (in this case a simple line vector)&lt;/strong&gt;&lt;/u&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a title="RasterImageElevation" href="http://www.flickr.com/photos/99548241@N00/2916843892/"&gt;&lt;img border="0" alt="RasterImageElevation" src="http://static.flickr.com/3124/2916843892_0a7042d488.jpg" width="364" height="255" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td&gt;&lt;a title="vectorGeom1" href="http://www.flickr.com/photos/99548241@N00/2916875752/"&gt;&lt;img border="0" alt="vectorGeom1" src="http://static.flickr.com/3276/2916875752_9ea942fe1e.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;SQL Server 2008 does focus exclusively on Spatial Vector data.&lt;/p&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;h4&gt;The SQL Server 2008 Spatial Data Types&lt;/h4&gt;  &lt;p&gt;SQL Server 2008 introduces two new data types:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Geometry&lt;/strong&gt;. The geometry data type is based on the Cartesian coordinate system,&amp;#160; based upon a &amp;quot;flat earth&amp;quot; representation model. In this model, a point is represented by an X, Y and optionally a Z coordinate. This usage domain of this data type is either:       &lt;ul&gt;       &lt;li&gt;The representation of simple coordinates in a two or three dimensional space. A example is the precise location of a pallet in a warehouse. &lt;/li&gt;        &lt;li&gt;The representation of map coordinates, where distances are limited enough so that they are not affected by the round earth model. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Geography&lt;/strong&gt;. The geography data point can store points, lines, polygon and collections of each of these, using a &amp;quot;round earth&amp;quot; model as opposed to the &amp;quot;flat earth&amp;quot; model used by the Geometry data type. Instead of using X and Y coordinates, the geography data type will use a latitude/longitude combination to represent a single point. Most of the GIS data available on the Web is latitude/longitude based, so the Geography data type is the data type you should used in most of you GIS applications, especially when you are dealing with longer distances where the shape of the earth becomes relevant. &lt;/li&gt; &lt;/ol&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;u&gt;&lt;strong&gt;Geometry : Cartesian coordinate system, &amp;quot;flat earth&amp;quot; model&lt;/strong&gt;&lt;/u&gt;&lt;/td&gt;        &lt;td&gt;&lt;u&gt;&lt;strong&gt;Geography: Latitude/longitude coordinates, &amp;quot;round earth&amp;quot; model&lt;/strong&gt;&lt;/u&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;a title="CartesianCoordinateSystem" href="http://www.flickr.com/photos/99548241@N00/2916940482/"&gt;&lt;img border="0" alt="CartesianCoordinateSystem" src="http://static.flickr.com/3210/2916940482_ec175018e3.jpg" width="290" height="290" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td&gt;&lt;a title="LATITUDE_LONGITUDE_MERIDIA" href="http://www.flickr.com/photos/99548241@N00/2916940504/"&gt;&lt;img border="0" alt="LATITUDE_LONGITUDE_MERIDIA" src="http://static.flickr.com/3210/2916940504_f94a4bb23d.jpg" width="298" height="386" /&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;The geometry data type conforms to the &lt;a href="http://www.opengeospatial.org/"&gt;Open Geospatial Consortium&lt;/a&gt; (OGC) &lt;a href="http://www.opengeospatial.org/standards/sfa"&gt;Simple features for SQL specification version 1.1.0&lt;/a&gt;. The OGC is a non-profit, voluntary concensus standards organization which is the leading consortium when it comes to the drafting and ratification of standards for geospatial and location based services. One of the standards published by the OGC is the Well-Know-Text specification (&lt;a href="http://en.wikipedia.org/wiki/Well-known_text"&gt;WKT&lt;/a&gt;) for spatial data types. We will investigate this format in detail in part 2 of the series.&lt;/p&gt;  &lt;h4&gt;CLR Objects in the Database Engine and the Database Developer&lt;/h4&gt;  &lt;p&gt;Both the geometry and geography data types are implemented as user-defined types (UDT&amp;#39;s) in the database engine. These UDT&amp;#39;s are implemented as .NET Common Language Runtime (CLR) types. Before we take a more detailed look how to use these types, it is important that we make sure that the reader is familiar with some basic OO principles. If you are already familiar with object-orientation and .NET types, please feel free to skip ahead to the next part in this series.&lt;/p&gt;  &lt;p&gt;The core abstraction in the object-oriented world is the&lt;strong&gt; &lt;/strong&gt;&lt;em&gt;class&lt;/em&gt;. A class can be seen as the blueprint for a particular type. From this blueprint, a client can create any number of actual &lt;em&gt;object instances&lt;/em&gt;. A class hides away its implementation details behind a set of publicly accessible properties and methods. This principle is called &lt;strong&gt;encapsulation &lt;/strong&gt;or&lt;strong&gt; information hiding. &lt;/strong&gt;For example, a &lt;font size="2" face="Courier New"&gt;Car&lt;/font&gt; class will encapsulate the behavior of an automobile. It might expose methods such as &lt;font face="Courier New"&gt;Start&lt;/font&gt;, &lt;font size="2" face="Courier New"&gt;Stop&lt;/font&gt;, &lt;font size="2" face="Courier New"&gt;SlowDown&lt;/font&gt; and &lt;font size="2" face="Courier New"&gt;SpeedUp&lt;/font&gt;, and it might provide properties such as &lt;font size="2" face="Courier New"&gt;CurrentSpeed&lt;/font&gt; and &lt;font size="2" face="Courier New"&gt;DaysTillNextOilChange&lt;/font&gt;. The &lt;font size="2" face="Courier New"&gt;Car&lt;/font&gt; class will hide the details of how it executes these methods and exposes these properties, enabling the client to be &amp;quot;blissfully unaware&amp;quot; of the implementation details of the &lt;font size="2" face="Courier New"&gt;Car&lt;/font&gt; class.&lt;/p&gt;  &lt;p&gt;Classes can be related to one another. At a high-level we can recognize the following types of relationships:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;The &amp;quot;has-a&amp;quot; relationship. For example, a &lt;font size="2" face="Courier New"&gt;Car&lt;/font&gt; class might have a &lt;font size="2" face="Courier New"&gt;SteeringWheel&lt;/font&gt; and a &lt;font size="2" face="Courier New"&gt;GasTank&lt;/font&gt;. This type of relationship is sometimes referred to as a &amp;quot;uses&amp;quot; relationship, for example the Car class &amp;quot;uses&amp;quot; the &lt;font size="2" face="Courier New"&gt;SteeringWheel&lt;/font&gt; class and &amp;quot;uses&amp;quot; the &lt;font size="2" face="Courier New"&gt;GasTank&lt;/font&gt; class. &lt;/li&gt;    &lt;li&gt;The &amp;quot;is-a&amp;quot; relationship. To stay with our &lt;font size="2" face="Courier New"&gt;Car&lt;/font&gt; example, a &lt;font size="2" face="Courier New"&gt;SportsCar&lt;/font&gt;&lt;strong&gt; &lt;/strong&gt;is a specialized type of &lt;font size="2" face="Courier New"&gt;Car&lt;/font&gt;,&amp;#160; which is specially equipped. It might have a &lt;font size="2" face="Courier New"&gt;Spoiler&lt;/font&gt;, a &lt;font size="2" face="Courier New"&gt;HighPerformanceEngine&lt;/font&gt; etc.. When classes have such a relationship they will use an OOP concept called &lt;strong&gt;inheritance&lt;/strong&gt; to implement this relationship. In an inheritance implementation, the class from which we inherit is called the &lt;em&gt;base class&lt;/em&gt; and the more specialized class is called the&lt;em&gt; sub class&lt;/em&gt;. The sub class gets all of the functionality of the base class &amp;quot;for free&amp;quot;, so it only needs to worry about implementing it own specialized behavior on top of the functionality of the base class. For example, the &lt;font size="2" face="Courier New"&gt;SportsCar&lt;/font&gt; class only implements the additional functionality that makes it a sports car. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;An example of a &amp;quot;uses&amp;quot; (&amp;quot;has a&amp;quot;) and an inheritance (&amp;quot;is a&amp;quot;) relationship is shown in the figure below:&lt;/p&gt;  &lt;p&gt;&lt;a title="OOLatest" href="http://www.flickr.com/photos/99548241@N00/2919345220/"&gt;&lt;img border="0" alt="OOLatest" src="http://static.flickr.com/3229/2919345220_63ec8c85d7.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Some base classes only define a general abstract concepts or entities. These types of classes cannot be directly instantiated by the client, since they are not &amp;quot;feature complete&amp;quot;. Such a class is called an &lt;em&gt;abstract class&lt;/em&gt; The features defined by an abstract class are implemented by a sub class of the abstract class. Such a sub class that can be instantiated is called a&lt;em&gt; concrete class&lt;/em&gt;. We will see in the next section that the geometry and geography classes are indeed defined as abstract classes in the database engine.&lt;/p&gt;  &lt;p&gt;In the next part of this series, we will take a look at the class diagrams for both the geography and geometry classes, and we&amp;#39;ll start writing some TSQL code!&lt;/p&gt;&lt;img src="http://footheory.com/aggbug.aspx?PostID=414" width="1" height="1"&gt;</content><author><name>bennie</name><uri>http://footheory.com/members/bennie.aspx</uri></author></entry><entry><title>An Introduction to LINQ to XML</title><link rel="alternate" type="text/html" href="http://footheory.com/blogs/bennie/archive/2008/09/17/an-introduction-to-linq-to-xml.aspx" /><id>http://footheory.com/blogs/bennie/archive/2008/09/17/an-introduction-to-linq-to-xml.aspx</id><published>2008-09-17T15:35:18Z</published><updated>2008-09-17T15:35:18Z</updated><content type="html">&lt;h3&gt;Note: This post is a work in progress... not yet completed...&lt;/h3&gt; &lt;h3&gt;Overview&lt;/h3&gt; &lt;p&gt;When Visual Studio 2008 and the .NET Framework 3.5 shipped in late 2007, the feature that got by far the most attention was &lt;strong&gt;Language Integrated Query (LINQ).&lt;/strong&gt; This article will provide a quick overview of the LINQ technologies, and will then focus in on&lt;strong&gt; LINQ to XML&lt;/strong&gt;, which is a subset of the LINQ technologies.&lt;/p&gt; &lt;p&gt;This article is structured as follows:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;The next section will provide a short overview of LINQ in general. We take a look at what the main drivers were behind the creation of LINQ, and we will start looking at some of the specifics of LINQ to XML.  &lt;li&gt;Once we have established a basic understanding of LINQ to XML, we will take a look at its object model. LINQ to XML introduces an easy to use, flattened object model, especially when compared to the XML DOM object model.  &lt;li&gt;Next, we will take a look at what is in my opinion one of the most important features of LINQ to XML, and that is &lt;strong&gt;Functional Construction&lt;/strong&gt;. Functional construction enables us to create an XML document in a very straightforward way. No longer do we need to use the elaborate XML DOM object model and write 100 lines of complex code, just to create a simple XML document that is just a few lines long.  &lt;li&gt;After we have an understanding of how to create an XML document, we take a look at how we can use the features on the new LINQ to XML object model to query, iterate, manipulate and validate an XML document.  &lt;li&gt;To illustrate how easy it is to leverage the LINQ to XML features in a real-world application, we will take a look at an example that&amp;nbsp; performs two-way binding of a rather complex XML document to a WPF tree control.  &lt;li&gt;To round out our discussion, we will take a look at some practical tips and tricks, which enables us to take full advantage of LINQ to XML, and we will also mentioned some common pitfalls, and inform you how to save time not making the same mistakes as your truly ;-)!&lt;/li&gt;&lt;/ol&gt; &lt;h4&gt;Prerequisites&lt;/h4&gt; &lt;p&gt;If you want to run the code samples that are associated with this article, you will need the following pre-requisites:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Since we will be using LINQ, you obviously need to have a version of Visual Studio 2008 installed. If you install Visual Studio, you will automatically also install .NET 3.5 and the C# 3.0 compiler.  &lt;li&gt;We will be showing how you can use LINQ to SQL to create XML documents, so you will need to have SQL Server 2005 or the SQL Server 2008 beta installed. If you have the express edition installed, I recommend you also download SQL Server Management Studio express.  &lt;li&gt;We will be using the &lt;font face="Courier New" size="2"&gt;AdventureWorks &lt;/font&gt;sample database to illustrate how we can create an XML document from a SQL Server database, so you should have the latest version of the &lt;font face="Courier New" size="2"&gt;AdventureWorks &lt;/font&gt;database installed. If you currently don&amp;#39;t have this database installed, you can navigate to: &lt;a title="http://www.codeplex.com/MSFTDBProdSamples/Release/ProjectReleases.aspx?ReleaseId=4004" href="http://www.codeplex.com/MSFTDBProdSamples/Release/ProjectReleases.aspx?ReleaseId=4004"&gt;http://www.codeplex.com/MSFTDBProdSamples/Release/ProjectReleases.aspx?ReleaseId=4004&lt;/a&gt;, and download the appropriate version of the &lt;font face="Courier New" size="2"&gt;AdventureWorks*.msi&lt;/font&gt; file, and follow the instructions to install the database on your SQL server.&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;LINQ Overview&lt;/h3&gt; &lt;h4&gt;&lt;/h4&gt; &lt;h4&gt;Background - Problem Description&lt;/h4&gt; &lt;p&gt;Most of us write business applications to earn our living. All business&amp;nbsp; applications that I ever worked with deal with some type of data, and quite a number of them involved multiple heterogeneous data sources.&amp;nbsp; &lt;/p&gt; &lt;p&gt;In the early days (1980-1990) all of the data for an application was centralized in one file, and the data access capabilities were directly built into the language (I know that at this point, my friend Pete Miller is thinking back nostalgically about his FoxPro and DBASE days... ;-). The upside of this was that data querying and data manipulation were a core part of the programming experience, but the downside was that every platform (DBASE, FoxPro, FileMaker) would integrate these data access features in a completely different way, tailored to the capabilities of the underlying data access tool. As a result, programmers faced a steep learning curve when moving from one platform to another. Another drawback of these first-generation data access systems was scalability. All platforms were file-based, and therefore had a hard time scaling to multiple users and large data sizes. &lt;/p&gt; &lt;p&gt;In response to this and other issues, (1990s&amp;nbsp; through early 2000s) &lt;u&gt;&lt;em&gt;relational database systems&lt;/em&gt;&lt;/u&gt; (RDBMS) were created. All of these databases used an emerging query and DML language called &lt;em&gt;&lt;u&gt;SQL&lt;/u&gt;&lt;/em&gt; to access the data, and database programs migrated from being strictly tied to a particular data access system dialect, to using industry-standard SQL. The query and data manipulation features became again external to the core programming languages, and were typically made available through a set of external libraries (db-Library anyone?). This process was accelerated by the creation of ODBC, which provides a standard means of accessing any database that provides an ODBC driver.&lt;/p&gt; &lt;p&gt;In recent years, we have seen the emergence of &lt;u&gt;&lt;em&gt;Object-Relational Mapping&lt;/em&gt;&lt;/u&gt; (ORM) tools. The main philosophy behind the ORM movement was the fact that designers and programmers are dealing with objects to represent their data, but each time they have to persist or load these objects from a data store, they have to make a paradigm shift back to SQL and the relational model,&amp;nbsp; and the specific details associated with the database access libraries that are being used. An ORM tool, such as NHibernate takes over the responsibility of persisting and loading objects to the database in a transparent fashion.&lt;/p&gt; &lt;p&gt;While both SQL and their associated data access technologies (such as ADO.NET) and/or the newer ORM tools have simplified things significantly, we still have a number of challenges that remain:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Most real-world applications out there deal with other data types besides relational data. Indeed, in this connected world, we access a variety of XML data sources, we connect to RSS feeds, leverage Web Services using the SOAP or REST protocols, access data in Active Directory or some other LDAP-based data store, and so on. Each of these data sources have their own data access paradigms.  &lt;li&gt;When working with &amp;quot;plain old objects&amp;quot;, we have to use a very different API to&amp;nbsp; sort, filter, group our otherwise manipulate our objects, as compared to relational data. Wouldn&amp;#39;t it be nice if we could have one standard API for these common tasks?  &lt;li&gt;Often we have to perform complex data transformations and/or data shaping. The way in which these transformations are performed is often dependent on the type of the data. For XML we use XSLT, for relational data we use views or complex joins, for objects we use manual code etc. Again, it would be nice to have access to one standard approach for performing transformations.  &lt;li&gt;What if we want to access data from a dynamic language, such as Ruby, IronPython, PowerShell, F# or any of the future DLR-based languages? Will these languages be able to use the same data access tool as the statically-typed .NET languages such as C# or VB.NET?&lt;/li&gt;&lt;/ol&gt; &lt;h4&gt;Microsoft&amp;#39;s Answer: LINQ&lt;/h4&gt; &lt;p&gt;At the core, LINQ is really a set of constructs, built into the language, which allow us to work with any type of data, be it relational, XML or plain old objects. LINQ is supported in both C# 3.0 and VB 9.0, which are compilers that shipped with Visual Studio 2008. In a way, LINQ brings us &amp;quot;back to the future&amp;quot;, making querying and manipulating data&amp;nbsp; a core programming concept again. The main different with the &amp;quot;old school&amp;quot; languages such as FoxPro is that LINQ is fully independent of the type of data that is being accessed (object, relational data, XML, etc.), and the specific implementation of the data source (SQL Server, Oracle etc.).&lt;/p&gt; &lt;p&gt;The LINQ features in the C# 3.0 compiler are built on top of a number of other language enhancements such as:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Anonymous types  &lt;li&gt;Anonymous methods  &lt;li&gt;Type inference  &lt;li&gt;Lambda expressions  &lt;li&gt;Expression trees  &lt;li&gt;Extension methods  &lt;li&gt;Instance and collection initializers  &lt;li&gt;Partial methods&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;A number of these features were addressed in some of my previous posts. Please refer to the blog archives for more information.&lt;/p&gt; &lt;p&gt;The .NET 3.5 Framework also provides LINQ support through a number of types, available in the System.*.LINQ namespaces. These types provide additional support on top of the compiler features.&lt;/p&gt; &lt;p&gt;A graphical overview of LINQ is shown below:&lt;/p&gt; &lt;p&gt;&lt;a title="LINQ Overview" href="http://www.flickr.com/photos/99548241@N00/2178356509/"&gt;&lt;img alt="LINQ Overview" src="http://static.flickr.com/2302/2178356509_493307271e.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;h4&gt;LINQ to XML&lt;/h4&gt; &lt;p&gt;LINQ to XML is portion of LINQ that allows us to:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Construct  &lt;li&gt;Traverse  &lt;li&gt;Manipulate  &lt;li&gt;Query  &lt;li&gt;Search&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;XML documents and fragments, using the standard LINQ API. &lt;/p&gt; &lt;p&gt;One of the main goals of LINQ to XML was to address the main shortcomings in the W3C XML DOM API, as implemented in the System.Xml.* .NET 2.0 namespaces, with a focus on the following areas:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Simplify XML tree construction with functional construction.  &lt;li&gt;Eliminate document centricity in favor of element centricity.  &lt;li&gt;Simplify naming by eliminating prefixes from the API.  &lt;li&gt;Simplify Node value extraction.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The above topics have always been a hard area to deal with for any programmer working with XML documents. XML DOM code is unnecessary complex and bloated, and often unintentionally obfuscated. For example, it is not easy to imply the structure of the created XML document, when reading XML DOM document creation code.&lt;/p&gt; &lt;p&gt;Other issues that Microsoft wanted to address with LINQ to XML is to allow a developer to quickly move data extracted from a relational model to an XML representation, or from an object graph to an XML document. This current DOM API does not support constructs such as projections inside a XQuery, LINQ to XML provides an elegant solution to this problem.&lt;/p&gt; &lt;p&gt;In the .NET 3.5 framework, LINQ to XML is implemented in the &lt;font face="Courier New" size="2"&gt;System.Xml.Linq.dll&lt;/font&gt; assembly, and exposed through the &lt;font face="Courier New" size="2"&gt;System.Xml.Linq&lt;/font&gt; namespace.&lt;/p&gt; &lt;p&gt;The dependencies of the &lt;font face="Courier New" size="2"&gt;System.Xml.Linq.dll&lt;/font&gt; assembly is show in the figure below:&lt;/p&gt; &lt;p&gt;&lt;a title="System.XML.Linq.Overview" href="http://www.flickr.com/photos/99548241@N00/2184371268/"&gt;&lt;img alt="System.XML.Linq.Overview" src="http://static.flickr.com/2218/2184371268_915a787b32.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;LINQ to XML Object Model&lt;/h3&gt; &lt;p&gt;LINQ to XML was developed with Language-Integrated Query over XML in mind from the onset. It takes advantage of the standard query operators and adds query extensions specific to XML. Just as significant as the Language-Integrated Query capabilities of LINQ to XML is the fact that LINQ represents a consistent query experience across all LINQ enabled APIs and allows us to combine XML queries from other data sources. So, with one query, you can access data from:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Local objects in memory  &lt;li&gt;An XML Data Source  &lt;li&gt;One or more SQL Server data sources&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;The core classes that make up the LINQ to XML object model are listed below:&lt;/p&gt; &lt;p&gt;&lt;a title="LinqToXMLCoreClasses" href="http://www.flickr.com/photos/99548241@N00/2181197474/"&gt;&lt;img alt="LinqToXMLCoreClasses" src="http://static.flickr.com/2342/2181197474_1d2d452b3e.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;As you can conclude from the object model above, the number of classes involved has been dramatically reduced, resulting in a reduced learning curve. Actually I think that the biggest challenge in working with LINQ to XML is to unlearn some of the bad practices that we had to burn into our brain to make the W3C XML DOM work for us.&lt;/p&gt; &lt;p&gt;Some key issues regarding this object model are listed below:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;ol&gt; &lt;li&gt;You can now work in a &amp;quot;document free mode&amp;quot; if you would like to do so. In some scenarios, you simply want to create or load some XML, manipulate and query it, and save it back. With the W3C DOM, you would be forced to create an XML document. In LINQ to XML, this is no longer the case. To perform the task listed, you could simply:  &lt;ul&gt; &lt;li&gt;Create &lt;font face="Courier New" size="3"&gt;XElements&lt;/font&gt; directly (without having an &lt;font face="Courier New" size="3"&gt;XDocument&lt;/font&gt; involved at all)  &lt;li&gt;Manipulate the &lt;font face="Courier New" size="3"&gt;XElements&lt;/font&gt; or &lt;font face="Courier New" size="3"&gt;XAttributes&lt;/font&gt; directly.  &lt;li&gt;Save the resulting XML tree directly to a writer.&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;XML names have been greatly simplified. LINQ to XML goes out of its way to make XML names as straightforward as possible. One can say that the complexity of XML names does not originate in namespaces, but from XML prefixes. XML prefixes can be used for reducing the keystrokes required when inputting XML or making XML easier to read, however prefixes are just shortcuts for using the full XML namespace. On input LINQ to XML resolves all prefixes to their corresponding XML Namespace and prefixes are&amp;nbsp; not exposed at all in the programming API. In LINQ to XML, a &lt;font face="Courier New" size="3"&gt;XName&lt;/font&gt; represents a full XML name consisting of an &lt;font face="Courier New" size="3"&gt;XNamespace&lt;/font&gt; and the local name. Developers will usually find it more convenient to use the &lt;font face="Courier New" size="3"&gt;XNamespace&lt;/font&gt; rather than the namespace URI string.  &lt;li&gt;An attribute (modeled by means of the &lt;font size="3"&gt;XAttribute&lt;/font&gt; class) is no longer a subclass of the node class). It is now simply a &lt;font face="Courier New" size="3"&gt;XName&lt;/font&gt;-value pair, which is what it always should have been.&lt;/li&gt;&lt;/ol&gt; &lt;h3&gt;Functional Construction&lt;/h3&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Querying&lt;/h3&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;WPF Data Binding&lt;/h3&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;&lt;/h3&gt; &lt;h3&gt;Tips and Tricks&lt;/h3&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Conclusion&lt;/h3&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Notes: Make sure how to construct an XML document from a LINQ database query&lt;/p&gt;&lt;img src="http://footheory.com/aggbug.aspx?PostID=412" width="1" height="1"&gt;</content><author><name>bennie</name><uri>http://footheory.com/members/bennie.aspx</uri></author></entry><entry><title>Creating Application Shortcuts  with Google Chrome</title><link rel="alternate" type="text/html" href="http://footheory.com/blogs/bennie/archive/2008/09/07/creating-application-shortcuts-with-google-chrome.aspx" /><id>http://footheory.com/blogs/bennie/archive/2008/09/07/creating-application-shortcuts-with-google-chrome.aspx</id><published>2008-09-07T18:46:44Z</published><updated>2008-09-07T18:46:44Z</updated><content type="html">&lt;h3&gt;Introduction&lt;/h3&gt; &lt;p&gt;Unless you have been living under a rock for the last week, you probably know that Google shipped the first beta-version of it&amp;#39;s new browser, named &amp;quot;&lt;a href="http://tools.google.com/chrome/" target="_blank"&gt;Google Chrome&lt;/a&gt;&amp;quot;. I am not planning to start yet another debate here about why I think Google decided at this point that it needed to get in the Web browser business. You can read plenty of interesting comments on various blog sites, for example Paul Thurrot, from the &lt;a href="http://www.winsupersite.com/" target="_blank"&gt;Windows Supersite&lt;/a&gt; had some very interesting feedback on the subject in his &lt;a href="http://www.winsupersite.com/paul/podcast.asp" target="_blank"&gt;Windows Weekly Podcast&lt;/a&gt; with Leo Laporte.&lt;/p&gt; &lt;p&gt;Most of the&amp;nbsp; features introduced by Chrome have an equivalent in &lt;a href="http://www.microsoft.com/windows/products/winfamily/ie/default.mspx" target="_blank"&gt;Microsoft&amp;#39;s upcoming IE 8 browser&lt;/a&gt; (beta 2 just shipped a couple of weeks ago). I do want to highlight one interesting feature of Chrome and that is the ability to &lt;strong&gt;create application shortcuts&lt;/strong&gt;.&lt;/p&gt; &lt;h3&gt;What is&amp;nbsp; a Chrome Application Shortcut?&lt;/h3&gt; &lt;p&gt;A Chrome Application Shortcut is basically a quick, streamlined way to access a Web Application&amp;#39;s functionality in it&amp;#39;s own window. You can create a shortcut on either the desktop, the &amp;quot;Start bar&amp;quot;, or the &amp;quot;Quick Launch&amp;quot; toolbar. Once the short cut is created, you can simply double-click the shortcut to launch the application in it&amp;#39;s own window. Using shortcuts is a nice alternative to launching the full browser window, and entering the URL (either manually or through a &amp;quot;favorites&amp;quot; entry).&lt;/p&gt; &lt;p&gt;Also, if you use Google Gears, you optionally have the ability to access the application&amp;#39;s functionality if offline mode (if so desired).&lt;/p&gt; &lt;h3&gt;Walkthrough&lt;/h3&gt; &lt;p&gt;To create a shortcut, first navigate to the URL of the Web Application. Next, click the Page menu next to the address bar, and select the &amp;quot;Create application shortcuts..&amp;quot; menu item, as is shown below:&lt;/p&gt; &lt;p&gt;&lt;a title="CreateChromeShortcut" href="http://www.flickr.com/photos/99548241@N00/2837303820/"&gt;&lt;img alt="CreateChromeShortcut" src="http://static.flickr.com/3174/2837303820_64e88811f8.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;In the Google Gears dialog box that comes up, you can select the location(s) for your shortcut. So in my case, I elected to create a shortcut to Gmail, and I opted to have a shortcut on both my desktop and the &amp;quot;Quick Launch&amp;quot; bar.&lt;/p&gt; &lt;p&gt;&lt;a title="ChromeShortcutLocations" href="http://www.flickr.com/photos/99548241@N00/2836468873/"&gt;&lt;img alt="ChromeShortcutLocations" src="http://static.flickr.com/3134/2836468873_650b2d9311.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Note that Chrome will use the appropriate icon for your shortcut.&lt;/p&gt; &lt;p&gt;After creating your shortcut, I can simply double-click the shortcut, to open the selected Web Application as show below:&lt;/p&gt; &lt;p&gt;&lt;a title="ChromeShortcutInQuickLaunch" href="http://www.flickr.com/photos/99548241@N00/2836468821/"&gt;&lt;img alt="ChromeShortcutInQuickLaunch" src="http://static.flickr.com/3029/2836468821_67102fb325.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The application opens up in its own Chrome window, without any toolbar or address bar clutter, as shown below:&lt;/p&gt; &lt;p&gt;&lt;a title="ChromAppInOwnWindow" href="http://www.flickr.com/photos/99548241@N00/2836468951/"&gt;&lt;img alt="ChromAppInOwnWindow" src="http://static.flickr.com/3102/2836468951_07ebdfed39.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://footheory.com/aggbug.aspx?PostID=410" width="1" height="1"&gt;</content><author><name>bennie</name><uri>http://footheory.com/members/bennie.aspx</uri></author></entry><entry><title>Software as a Service - A high level overview</title><link rel="alternate" type="text/html" href="http://footheory.com/blogs/bennie/archive/2007/12/15/software-as-a-service-a-high-level-overview.aspx" /><id>http://footheory.com/blogs/bennie/archive/2007/12/15/software-as-a-service-a-high-level-overview.aspx</id><published>2007-12-15T22:13:27Z</published><updated>2007-12-15T22:13:27Z</updated><content type="html">&lt;h3&gt;Table of Contents&lt;/h3&gt; &lt;p&gt;Software as a service is a term is frequently making headlines in a number of trade journals. In all articles on the subject, Software as a Service is mentioned as the "next big thing", which is going to revolutionize the software industry as we know it.&lt;/p&gt; &lt;p&gt;This article will provide a high-level overview of the subject. The article structured as follows:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;In the first section we introduce Software as a Service (know by its acronym Saas), provide a definition and discuss some fundamental topics that form the basis for the technology. Also, since the concept of a "tenant" and "multi-tenancy" is closely associated with Saas, we will include a definition for these terms in the same section.&lt;/li&gt; &lt;li&gt;The next section will address how Saas can mitigate the software acquisition risks for an organization.&lt;/li&gt; &lt;li&gt;Often, a (false) rumor has been spread throughout the industry, that SaaS eliminates the need for an client organization's IT staff. In our next section, we clarify this misconception, and show how SaaS can empower an IT organization to focus on new initiatives that contribute measurable, immediate value to the client's organization.&lt;/li&gt; &lt;li&gt;Next, we discuss the three core attributes that are essential for an effective single instance, multi-tenant application architecture.&lt;/li&gt; &lt;li&gt;Four different maturity models have been defined for a multi-tenant SaaS application, our next section discusses these different maturity levels and their specifics.&lt;/li&gt; &lt;li&gt;In the last section of this article, I provide the reader with some guidance of how the select the appropriate maturity level for their organization's&amp;nbsp; Saas application(s).&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;This article is mostly non-technical is nature. However, I am planning to follow-up this article with a number of technical articles, where we dive into some of the more challenging areas that make it possible to create a highly scalable, configurable and multi-tenant-efficient SaaS solution.&lt;/p&gt; &lt;h3&gt;Introduction&lt;/h3&gt; &lt;p&gt;When you ask a number of software professionals for a definition of the term "Software as a Service", you will get many different, and sometimes conflicting answers. Slowly tough, more and more experts are starting to agree on the fundamental principles that define Software as a Service, and the concepts that differentiate the technology from traditional, on-premise packaged software solutions.&lt;/p&gt; &lt;p&gt;The current, widely-accepted definition for Software as a Service can best be phrased as follows:&lt;/p&gt; &lt;p align="center"&gt;&lt;em&gt;&lt;font size="3"&gt;&lt;strong&gt;Saas&lt;/strong&gt; is software deployed as a multi-tenant hosted service and accessed over the Internet.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Saas should not be confused with the services provided by traditional Application Service Providers (ASPs). An ASP typically provides a "shrink-wrapped" application to business users over&amp;nbsp; the Internet, and therefore can be better compared with a traditional on-premise IT application which has been deployed and hosted by a third-party. These applications were architected as a single-tenant application, and were not designed to share data and business process logic with other applications. Since we used the term &lt;strong&gt;tenant&lt;/strong&gt; here I feel like another definition is in order:&lt;/p&gt; &lt;p align="center"&gt;&lt;em&gt;&lt;font size="3"&gt;A &lt;strong&gt;tenant&lt;/strong&gt; is a client organization, which is using an application that has been deployed as a SaaS Application.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Multitenancy&lt;/strong&gt; refers to the architectural principle, in which a single instance of the software runs on as Software as a Service (SaaS) vendor's servers, servicing multiple client organizations (tenants). Multitenancy can be contrasted with a multi-instance architecture, where separate software instances (or hardware systems) are set up for different client organizations. With a multitenant architecture, a software application is designed to virtually partition its data and configuration so that each client organization works with a different virtual application instance.&lt;/p&gt; &lt;p&gt;A typical SaaS application is offered either directly by the vendor or by an intermediary party called an &lt;em&gt;aggregator&lt;/em&gt;, which bundles SaaS offerings from different vendors and offers them as part of a unified application platform.&lt;/p&gt; &lt;p&gt;I strongly believe that Saas is going to have a major impact on the software industry, because software as a service will change the way people build, sell, buy and use software. For this to happen though, software vendors need resources and information about developing Saas applications effectively.&lt;/p&gt; &lt;p&gt;When you take a look at our definition for Saas, it should become immediately clear that it does not prescribe any specific application architecture; it does not say anything about &lt;/p&gt; &lt;h3&gt;Saas and Software Acquisition Risk Mitigation&lt;/h3&gt; &lt;p&gt;Another area in which Saas applications tend to be different as compared to on-premise software is in their licensing model. On-Premise software applications typically have a high cost of entry, either because the application has to be developed from scratch by the internal or external IT staff, or in the case of a purchased application, because of the high up-front licensing fees. In contrast, SaaS application access is typically sold based upon a subscription model. The different subscription models offered by SaaS vendors are:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;A flat time-based fee (monthly, yearly etc.). This time-based fee will typically be much lower than the large up-front licensing fees for purchased on-premise applications.  &lt;li&gt;Usage based upon the metered activity by the customer, where 'usage activity' can be measured in a variety of ways, including number of business transactions, number of orders processed etc.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Some vendors will use a combination of both models, charging a flat time based fee in addition to some usage-based premium. In addition, most Saas vendors offer a "try before you buy" option, where a potential tenant has the opportunity to try out the application for a period of time before needing to make a commitment towards becoming a full-fledged customer.&lt;/p&gt; &lt;p&gt;In the traditional model, deploying large scale business-critical software systems (SAP anyone ? ;-) has been a major undertaking. As we mentioned earlier, deploying these systems across a large enterprise can cost hundred of thousands of dollars in up-front licensing cost, and usually requires a small (or sometimes large&amp;nbsp; ;-) army of IT personnel and consultants to customize and integrate it with with the organization's other systems and data. The time, staff and budget requirements of a deployment of this magnitude represents a significant risk for an organization of any size, and often puts such software out of reach of smaller organizations that would otherwise be able to derive great benefits&amp;nbsp; from the applications.&lt;/p&gt; &lt;p&gt;The subscription-based delivery model of SaaS applications changes this whole mindset. SaaS applications don't require the deployment of a large infrastructure at the customer's location, which eliminates or drastically reduces the upfront commitment of resources. With no significant initial investment to amortize, an enterprise that deploys a Saas application that turns out to produce disappointing results can walk away and pursue a different direction, without having to abandon an expensive on-premise infrastructure.&lt;/p&gt; &lt;h3&gt;Does Saas eliminate the need for an IT organization?&lt;/h3&gt; &lt;p&gt;One (wrong) conclusion that some people draw from the deployment of SaaS-based application is that it eliminates, or drastically reduces the need for an internal IT staff of an tenant's organization. Indeed with SaaS, the job of deploying&amp;nbsp; an application and keeping it running from day to day - testing and installing patches, managing upgrades, monitoring performance, ensuring high availability, and so forth - is handled by the provider.&lt;/p&gt; &lt;p&gt;But, rather than eliminating the need for an internal IT staff, by transferring the responsibility for the above-mentioned "overhead" activities to a third-party, the IT department can focus more on high-value activities that align with and support the business goals of the enterprise. Instead of being primarily reactive and operations-focused, the chief information offices (CIO) and IT staff can more efficiently function as technology strategists to the rest of the company, working with the business units to understand their business needs and advise them on how to best use technology to accomplish their objectives.&lt;/p&gt; &lt;p&gt;So, instead of being made obsolete by SaaS, the IT department has an opportunity to contribute to the success of the enterprise more directly than ever before. For example, based upon business requirements, the IT staff could create "composite applications" and "executive dashboards", which act as integrators and collectors of the valuable data contained in the different Saas applications. A successful service-centric IT organization can directly produce more value for the business by providing services that draw from both internal and external sources and align closely with the overall business goals of the organization.&lt;/p&gt; &lt;h3&gt;The Three Attributes of a Single Instance Multi-Tenant Architecture&lt;/h3&gt; &lt;p&gt;From an application's architect point of view, there are three key differentiators that separate a well-design SaaS application from a poorly designed one. A well-designed SaaS application is:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Scaleable  &lt;li&gt;Multi-Tenant-efficient  &lt;li&gt;Configurable&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;A graphical representation of these three important differentiators is shown below:&lt;/p&gt; &lt;p&gt;&lt;a title="SaasDifferentiators" href="http://www.flickr.com/photos/99548241@N00/2110675553/"&gt;&lt;img alt="SaasDifferentiators" src="http://static.flickr.com/2156/2110675553_9da266ae35.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Scaling the application means achieving maximum&amp;nbsp; concurrently and using application resources more efficiently - for example, optimizing locking duration, statelessness, efficiently leveraging sharing pooled resources&amp;nbsp; such as thread and network connections, caching frequently used reference data, and partitioning large databases. Note that I am not stating here that a standard single-tenant application should NOT be designed&amp;nbsp; in a scaleable manner, but because of the resource-intensive nature of a multi-tenant application, these requirements are more amplified, and achieving maximum scalability is therefore even more important.&lt;/p&gt; &lt;p&gt;Multi-tenancy may be the most significant paradigm shift that an architect accustomed to designing isolated, single-tenant applications has to make. For example, when a user at one company accesses customer information by using a CRM application (e.g. SalesForce.com), service, the application instance that the user connects to may be accommodating users from dozens, or even hundreds, of other companies - all completely unbeknownst to any of the users. This requires an architecture that maximizes the sharing of resources across tenants, but in such a manner that the application is still able to differentiate data belonging to different customers. For example, in a multi-tenant environment, it might be prohibitive to allocate an expensive resource, such as a WIN32 process to a single tenant (we will have more to say about this topic in the next section). Also, the architect needs to ensure 100% data privacy for each tenant while maintaining an acceptable performance for each tenant.&lt;/p&gt; &lt;p&gt;Of course, if a single application instance on a single server has to accommodate users from several different companies at once, you can't simply write custom code to customize the end-user experience; anything you do to customize the application for one customer will change the application for other customers as well. Instead of customizing the application in the traditional sense, each customer uses metadata to configure the way the application appears and behaves for its users. The challenge for the SaaS Architect is to ensure that the task of configuring applications is simple and easy for the customers, without incurring extra development or operation costs for each configuration. Note that configuration is this context can apply to a number of different areas:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Allowing tenants to add custom fields or tables to the database.  &lt;li&gt;Providing a mechanism by which a tenant can customize the user interface and the look and feel of the application (for example, in the case of a web application, the user should be able to upload custom a style sheet for the application).  &lt;li&gt;Allowing tenants to customize the business process workflows, by including some type of process editor in the tenant's administrator user interface.&lt;/li&gt;&lt;/ol&gt; &lt;h3&gt;Saas as a Service-Oriented Architecture Maturity Model&lt;/h3&gt; &lt;p&gt;In the above sections, we have discussed the business and technical benefits of Saas. The biggest impact of SaaS tough might be the fact that SaaS finally provides an organization with the right incentives for moving IT towards&amp;nbsp; a services-centric model or in other words: a "real", applied SOA strategy with concrete,&amp;nbsp; tangible benefits.&lt;/p&gt; &lt;p&gt;Broadly speaking, SaaS service maturity can be expressed using a model with four distinct levels. Each level is distinguished from the previous one by the addition of one of the three attributes listed above. A graphical level with the different maturity levels is shown below:&lt;/p&gt; &lt;p&gt;&lt;a title="Saas Overview" href="http://www.flickr.com/photos/99548241@N00/2109143971/"&gt;&lt;img alt="Saas Overview" src="http://static.flickr.com/2134/2109143971_d2aa19a768.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h4&gt;&lt;/h4&gt; &lt;h4&gt;Maturity Level I : Ad Hoc / Custom&lt;/h4&gt; &lt;p&gt;The first level of maturity is similar to the traditional application service provider (ASP) model of software delivery, dating back to the 1990s. At this level, each customer (or tenant) has its own customized version of the hosted application, and runs its own instance of the application on the hosts's servers. Architecturally, software at this maturity level is very similar to traditionally-sold LOB (Line-of-Business) software, in that different clients within the organization connect to a single instance running on behalf of its other customers. Note that at this maturity level, application maintenance tends to be complication and time consuming. If a common bug is found, the fix has to be integrated into the code base for each different instance, and each instance has to be individually tested, validated and re-deployed.&lt;/p&gt; &lt;p&gt;Typically, traditional client-server applications can be moved to a SaaS model at the first level of maturity, with relatively little development effort, and without re-architecting the entire system from the ground up. Although this level offers few of the benefits of a fully mature Saas solution, it does allow vendors to reduce cost by consolidating server hardware and administration.&lt;/p&gt; &lt;h4&gt;Maturity Level II: Configurable&lt;/h4&gt; &lt;p&gt;At the second level of maturity, the vendor hosts a separate instance of the application for each customer (of tenant). Whereas in the first level each instance is individually customized for the tenant, at this level all instances use the same code implementation, and the vendor meets customer's needs by providing detailed configuration options that allow the customer to change how the application looks and behaves to its users. Despite being identical to one another at the code level, each instance remains wholly isolated from all others.&lt;/p&gt; &lt;p&gt;Moving to a single code base for all of a vendor's customers greatly reduces a Saas application's service requirements, because any changes made to the code base can be easily provided to&amp;nbsp; all of the vendor's customers at once, thereby eliminating the need to upgrade or slipstream individual customized instances. However, repositioning a traditional application as SaaS at the second maturity level can require significant more re-architecting than at the first level, if the application has been designed for individual customization rather than configuration metadata. Therefore, it is important to note that if an enterprise architect is architecting a new application, which might be initially be deployed as a single-tenant application, but has the potential to be migrated to a multi-tenant solution, it is recommended that you take a close look at the architecture of your application, and build in some of the core "enabling" building blocks that would enable you to move to a multi-tenant solution without re-architecting the entire application.&lt;/p&gt; &lt;p&gt;Similarly to the first maturity level, the second level requires that the vendor provide sufficient hardware and storage to support a potentially large number of application instances running concurrently.&lt;/p&gt; &lt;h4&gt;Maturity Level III: Configurable, Multi-Tenant-Efficient&lt;/h4&gt; &lt;p&gt; At the third level of maturity, the vendor runs a &lt;em&gt;single&lt;/em&gt; instance that serves every customer, with configurable metadata providing a unique user's experience and feature set for each one. Authorization and security policies ensure that each customer's data is kept separate from that of other customers; and, from the end user's perspective, there is no indication that the application instance is being shared among multiple tenants.&lt;/p&gt; &lt;p&gt;This approach eliminates the need to provide server space for as many instances as the vendor has customers, allowing for more more efficient use of computing resources that the second level, which translates directly into lower costs. A significant disadvantage of this approach is that the scalability of the application is limited. Unless partitioning is used to manage database performance, the application can be scaled only by moving it to a more powerful server (scaling up), until diminishing returns make it impossible to add more power cost-effectively.&lt;/p&gt; &lt;h4&gt;Maturity Level IV: Scalable, Configurable, Multi-Tenant-Efficient&lt;/h4&gt; &lt;p&gt; At the fourth and final level of maturity, the vendor hosts multiple customers on a load-balanced farm of identical instances, with each customer's kept separate, and with configurable metadata providing a unique user experience and feature set for each customer. A SaaS system is scalable to an arbitrarily large number of customers, because the number of servers and instances of the back end can be increased or decreased as necessarily to match demand, without requiring additional re-architecting of the application, and changes or fixes can be rolled out to thousands of tenants as easily as a single tenant.&lt;/p&gt; &lt;h3&gt;Selecting the Appropriate Maturity Level for your Application&lt;/h3&gt; &lt;p&gt;Given all of the above information, you might wonder what maturity level you should target for your SaaS application? Intuitively, one might expect the fourth level to be the ultimate goal for any SaaS application, but this is definitely not always the case. Indeed, it might be more helpful to think of SaaS maturity as a continuum between isolated data and code on one end, as shared data and code on the other, as is shown on the figure below:&lt;/p&gt; &lt;p&gt;&lt;a title="SelectingAMaturityModel" href="http://www.flickr.com/photos/99548241@N00/2113756924/"&gt;&lt;img height="136" alt="SelectingAMaturityModel" src="http://static.flickr.com/2409/2113756924_b64d3b8000.jpg" width="640" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Where your application should fall in this continuum depends on your business area, architectural experience and operational needs, and on customer considerations. As you'll be able to see event from this simple explanation, all of these considerations are interrelated to some degree.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Business Model.&lt;/strong&gt; Does an isolated approach make financial sense? Forsaking the economic and management benefits of a shared approach means offering your application to the consumer at a higher cost; however; under some circumstances, it may be worth it to meet other needs. In addition, customers might have strong legal (e.g HIPPAA for the health care industry) or cultural resistance to an architectural model in which multiple tenants share access to an application, even if you can demonstrated that it does not place confidential data at risk. Ultimately, of course, you'll need a business model that shows how your&amp;nbsp; application can make money at whichever maturity level you've targeted.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Architectural Model&lt;/strong&gt;. Can your application be made&amp;nbsp; to run in a single local instance, without a complete architectural overhaul? if you seeking to move a desktop-based or traditional client-server or distributed application to an Internet-based delivery system, then its architecture might be fundamentally incompatible with a single-instance, metadata-centric approach, and you may determine that it will never make financial sense to invest the development effort necessary to transform it into a fully mature SaaS application. If you are designing and building a net-native application from the ground up, you will probably have a lot more freedom to take a single-instance approach.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Operational Model&lt;/strong&gt;. Can you guarantee your service level agreements (SLAs) without isolation? You (and your legal department ;-) should carefully example the obligations imposed by any existing SLAs that you have with your existing customers, with regard to considerations such as downtime, support operations, and disaster recovery, and determine whether these obligations can be met under an application architecture in which multiple unrelated customers share access to a single application instance.&lt;/li&gt;&lt;/ol&gt; &lt;h3&gt;Conclusion&lt;/h3&gt; &lt;p&gt;This concludes our high-level overview of SaaS. Obviously this is a very rich topic, but I hope that in the course of reading this article, you got a good basic understanding of what SaaS is, what its benefits are to an organization, the different maturity levels, and how to select a maturity level that is appropriate for your organization.&lt;/p&gt; &lt;p&gt;During the course of the coming week, I will be following up on this article with a more technical paper, which will describe some of the architectural challenges associated with building a single-instance, multi-tenant efficient and scalable application, so stay tuned!&lt;/p&gt;&lt;img src="http://footheory.com/aggbug.aspx?PostID=288" width="1" height="1"&gt;</content><author><name>bennie</name><uri>http://footheory.com/members/bennie.aspx</uri></author><category term="Saas" scheme="http://footheory.com/blogs/bennie/archive/tags/Saas/default.aspx" /><category term="Software as a Service" scheme="http://footheory.com/blogs/bennie/archive/tags/Software+as+a+Service/default.aspx" /></entry><entry><title>Team Foundation Server Extensibility - Navigating the Object Model</title><link rel="alternate" type="text/html" href="http://footheory.com/blogs/bennie/archive/2007/11/11/team-foundation-server-extensibility-navigating-the-object-model.aspx" /><id>http://footheory.com/blogs/bennie/archive/2007/11/11/team-foundation-server-extensibility-navigating-the-object-model.aspx</id><published>2007-11-12T01:16:50Z</published><updated>2007-11-12T01:16:50Z</updated><content type="html">&lt;h3&gt;Introduction&lt;/h3&gt; &lt;p&gt;In my &lt;a href="http://footheory.com/blogs/bennie/archive/2007/11/07/an-introduction-to-team-foundation-server-extensibility.aspx" target="_blank"&gt;previous post&lt;/a&gt; I introduced Team Foundation Server's customization and extensibility features. I mentioned how the TFS core functionality is exposed by means of the &lt;strong&gt;Team Foundation Core Services&lt;/strong&gt; (TFCS), which are essentially a set of five different Web Services. The functionality of these web services is encapsulated by the &lt;strong&gt;Team Foundation Server Object Model&lt;/strong&gt; (TFSOM), which is what Microsoft recommends you use to implement a Team Foundation extension.&lt;/p&gt; &lt;p&gt;The Team Foundation Object Model is implemented in a series of assemblies, some of which we will take a detailed look at in this post. We will explore some of the core objects in this object model, and we will build a small wrapper class library, called &lt;font face="Courier New" size="2"&gt;FooTheory.TFS.TFSConnectivity.&lt;/font&gt; We will use this class library as our foundation to create the following custom extensibility clients:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;A PowerShell &lt;font face="Courier New" size="2"&gt;PSDrive&lt;/font&gt; provider called &lt;font size="3"&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;FooTheory.TFS.TFSProvider&lt;/font&gt;.&lt;/font&gt;&lt;/font&gt; This provider will allows us to treat the TFS repository as a logical drive, so we will be able to use our favorite commands such as&amp;nbsp; &lt;font face="Courier New" size="2"&gt;dir, cd, copy, new &lt;/font&gt;(or their "offical"cmdlet names: &lt;font face="Courier New" size="2"&gt;Get-ChildItems, Set-Location, Copy-Item, New-Item&lt;/font&gt;)&amp;nbsp; to manipulate TFS artifacts such as Work Items, Stored Queries, Team Projects, Reports etc.&lt;/li&gt; &lt;li&gt;An event listener called FooTheory.TFS.EventListener. This is a WCF-based service, which can subscribe to TFS events, and receive these events through HTTP. The other clients, such as the PSDrive provider and the WPF client will be able to host this service, enabling them to be informed of any changes to their TFS artifacts of interest.&lt;/li&gt; &lt;li&gt;A rich WPF-based client called FooTheory.TFS.TFSExplorer. This client will take full advantage of the graphical expressiveness of Windows Presentation foundation to allow the user to navigate the complete TFS object model, including Work Items, Reports, Source Code trees etc.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt; An overview of the assemblies is shown in the figure below:&lt;/p&gt; &lt;p&gt;&lt;a title="MainLayers" href="http://www.flickr.com/photos/99548241@N00/2048565987/"&gt;&lt;img alt="MainLayers" src="http://static.flickr.com/2001/2048565987_a033cb8b3e.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;To start out, we will take a look at the TFSOM client assemblies which need to reference in our class library in order to implement our functionality.&lt;/p&gt; &lt;h2&gt;TFSOM Client Assemblies&lt;/h2&gt; &lt;p&gt;To leverage the functionality of the TFSOM, we need references to the following assemblies:&lt;/p&gt; &lt;p&gt;&lt;a title="DllOverview" href="http://www.flickr.com/photos/99548241@N00/2049299808/"&gt;&lt;img alt="DllOverview" src="http://static.flickr.com/2293/2049299808_12902cc342.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;If you have Team Explorer installed on your client, these assemblies should be located in the &lt;font face="Courier New" size="2"&gt;C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PrivateAssemblies&lt;/font&gt; location, together with all of the TFSOM assemblies. (If you have Orcas installed, you need to substitute "&lt;font face="Courier New" size="2"&gt;Visual Studio 9&lt;/font&gt;" for "&lt;font face="Courier New" size="2"&gt;Visual Studio 8&lt;/font&gt;" in the above path). Also, if you have Team Foundation Server 2008 installed, these assemblies will be the client assemblies for the Team TFS 2008, but these assemblies are 100% backwards compatible with TFS 2005 object model, so you can use the same assemblies to access both TFS versions.&lt;/p&gt; &lt;p&gt;In the next section we will take a look at the high-level design of our &lt;font face="Courier New" size="2"&gt;FooTheory.TFs.TFSConnnectivity&lt;/font&gt; custom class library.&lt;/p&gt; &lt;h3&gt;The FooTheory.TFS.TFSConnectivity assembly&lt;/h3&gt; &lt;p&gt;The main goal behind creating this assembly is to provide a simple API that provides access to some of the core functionality that we need to implement, for example:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Connecting and authenticating to a Team Foundation Server Instance.  &lt;li&gt;Retrieving a list of all Team Projects .  &lt;li&gt;Retrieve the Process Template of a given Team Project instance.  &lt;li&gt;Retrieving the Microsoft Project mapping properties for a Team Project instance.  &lt;li&gt;Subscribing and unsubscribing to a TFS Event Type.  &lt;li&gt;Retrieving all stored Work Item Queries for a given project.  &lt;li&gt;Executing a stored query, retrieving the resulting Work Items in the process.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The main class in our assembly is the &lt;font face="Courier New" size="2"&gt;FooTheory.TFS.TFSConnectivity.TFSServer&lt;/font&gt; class. An overview class diagram of this class and its main relationships is shown in the figure below:&lt;/p&gt; &lt;p&gt;&lt;a title="Overview" href="http://www.flickr.com/photos/99548241@N00/2049427358/"&gt;&lt;img alt="Overview" src="http://static.flickr.com/2055/2049427358_0faf3c1b9f.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The &lt;font face="Courier New" size="2"&gt;FooTheory.TFS.TFSConnectivity.dll&lt;/font&gt; assembly uses the Patterns &amp;amp; Practices Enterprise Library 3.1. Specifically, it leverages the &lt;font face="Courier New" size="2"&gt;Logging&lt;/font&gt; and &lt;font face="Courier New" size="2"&gt;Exception Handling &lt;/font&gt;blocks to enhance the robustness of the assembly. We'll have a few words to say about our usage of the Enterprise library at the end of this post.&lt;/p&gt; &lt;p&gt;Next, we will take a more detailed look at the class that is at the center of the Team Foundation Server Object Model, the &lt;font face="Courier New" size="2"&gt;Microsoft.TeamFoundation.Client.TeamFoundationServer &lt;/font&gt;class.&lt;/p&gt; &lt;p&gt;After we have a better understanding of this class, we will use our understanding of the &lt;font face="Courier New" size="2"&gt;TeamFoundationServer&lt;/font&gt; class to design and implement our &lt;font face="Courier New" size="2"&gt;TFSConnectivity&lt;/font&gt; assembly.&lt;/p&gt; &lt;h3&gt;The TeamFoundationServer Object&lt;/h3&gt; &lt;p&gt;The &lt;font face="Courier New" size="2"&gt;TeamFoundationServer&lt;/font&gt; object is the core object of the TFSOM. It contains the basic attributes of the Team Foundation Server that it is connected to. In addition, It provides access to the Team Foundation Core Services, as well as any other services that have been registered with Team Foundation Server, such as:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Version Control  &lt;li&gt;Work Item Tracking  &lt;li&gt;Project Templates  &lt;li&gt;Event subscriptions&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The &lt;font face="Courier New"&gt;TeamFoundationServer&lt;/font&gt; object is defined in the &lt;font face="Courier New" size="2"&gt;Microsoft.TeamFoundation.Client&lt;/font&gt; namespace, so you will need to have a reference to the &lt;font face="Courier New" size="2"&gt;Microsoft.TeamFoundation.Client.dll&lt;/font&gt; if your want to use it in your code.&lt;/p&gt; &lt;p&gt;You can get a reference to a &lt;font face="Courier New" size="2"&gt;TeamFoundationServer&lt;/font&gt; instance in one of two ways:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;You can use the &lt;font face="Courier New" size="2"&gt;TeamFoundationFactory.GetServer()&lt;/font&gt; method. This is the most commonly used strategy to create a &lt;font face="Courier New" size="2"&gt;TeamFoundationServer&lt;/font&gt; instance. The &lt;font face="Courier New" size="2"&gt;GetServer()&lt;/font&gt; method of the &lt;font face="Courier New" size="2"&gt;TeamFoundationServerFactory&lt;/font&gt; class supports the following overloads:  &lt;ul&gt; &lt;li&gt;You can only pass in the name of the server:&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt; &lt;blockquote&gt; &lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; TeamFoundationServer GetServer(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; name);&lt;/pre&gt;&lt;/div&gt;&lt;pre class="csharpcode"&gt;You can pass in the name of the TFS server and an object that implements the &lt;font face="Courier New" size="2"&gt;ICredentialsProvider&lt;/font&gt;&amp;nbsp; interface:&lt;/pre&gt;
&lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; TeamFoundationServer GetServer(
            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; name, ICredentialsProvider fallbackCredentialsProvider)&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;pre class="csharpcode"&gt;You can also choose to call the &lt;font face="Courier New" size="2"&gt;TeamFoundationServer&lt;/font&gt; constructor directly. The different overloads are shown below:&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; TeamFoundationServer(String name);
&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; TeamFoundationServer(
    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; name,
    ICredentials credentials);
&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; TeamFoundationServer(
    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; name,
    ICredentialsProvider credentialsProvider);
&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; TeamFoundationServer(
    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; name,
    ICredentials credentials,
    ICredentialsProvider credentialsProvider);
&lt;/pre&gt;&lt;/div&gt;&lt;pre class="csharpcode"&gt;The main difference between these two approaches is the fact that the Factory method caches the instance by the Uri of the server. The first time you call &lt;font face="Courier New" size="2"&gt;GetServer()&lt;/font&gt; with a specific server Uri, the factory will create a new &lt;font face="Courier New" size="2"&gt;TeamFoundationServer&lt;/font&gt; instance, add&amp;nbsp; it to cache (indexed by the server Uri) and return it to the caller. The next time you call &lt;font face="Courier New" size="2"&gt;GetServer()&lt;/font&gt; with the same server Uri (regardless of the &lt;font face="Courier New"&gt;ICredentialsProvider&lt;/font&gt; that is passed in), you will get exactly the same Uri instance. &lt;/pre&gt;
&lt;p&gt;The &lt;font face="Courier New"&gt;TeamFoundationServerFactory&lt;/font&gt; class was initially created to support the behavior of Team Explorer. In Team Explorer, you will notice that you will get the authentication dialog the first time your bring up the Explorer, but afterwards you are no longer prompted although behind the scenes, the team explorer code might have to call the Factory's &lt;font face="Courier New" size="2"&gt;GetServer()&lt;/font&gt; method multiple times. But, since the code is calling the &lt;font face="Courier New" size="2"&gt;GetServer()&lt;/font&gt; method with the same server Uri each time, you will NOT be prompted again.&lt;/p&gt;
&lt;p&gt;When you call the &lt;font face="Courier New"&gt;TeamFoundationServer&lt;/font&gt; constructor directly, you are obviously creating a new instance each time.&lt;/p&gt;
&lt;p&gt;As far as passing in credentials, you have basically two choices:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can pass in a reference to an object that implements the &lt;font face="Courier New" size="2"&gt;ICredentialsProvider&lt;/font&gt; interface. While you can pass in any instance that implements this interface, in a UI-based scenario you probably would want to use Microsoft.TeamFoundation.Client.UICredentialsProvider class. When you create a new instance of this class, it will automatically pop up the authentication dialog. So the following code:&lt;/li&gt;&lt;/ul&gt;&lt;pre class="code"&gt;                &lt;span&gt;// Create an instance of the UICredentialsProvider.
&lt;/span&gt;                &lt;span&gt;// Note that creating this instance will automatically
&lt;/span&gt;                &lt;span&gt;// popup the TFS authentication dialog
&lt;/span&gt;                &lt;span&gt;ICredentialsProvider&lt;/span&gt; provider = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;UICredentialsProvider&lt;/span&gt;();&lt;/pre&gt;
&lt;ul&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Will popup the following dialog:&lt;/p&gt;
&lt;p&gt;&lt;a title="TFSLogindialog" href="http://www.flickr.com/photos/99548241@N00/1973822715/"&gt;&lt;img alt="TFSLogindialog" src="http://static.flickr.com/2087/1973822715_177fa99583.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;You can pass in any &lt;font face="Courier New" size="2"&gt;NetworkCredential&lt;/font&gt; instance, for example:&lt;/li&gt;&lt;/ul&gt;&lt;pre class="code"&gt;                &lt;span&gt;// Create our Network Credentials
&lt;/span&gt;                &lt;span&gt;NetworkCredential&lt;/span&gt; credentials = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;NetworkCredential&lt;/span&gt;(TFSUserName, TFSPassword);
&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;h3&gt;Implementation in the FooTheory.TFS.TFSConnectivity Library&lt;/h3&gt;
&lt;h4&gt;Connecting to Team Foundation Server&lt;/h4&gt;
&lt;p&gt;The &lt;font face="Courier New" size="2"&gt;FooTheory.TFS.TFSConnectivity.TFSServer&lt;/font&gt; class contains an embedded instance of a &lt;font face="Courier New" size="2"&gt;TeamFoundationServer&lt;/font&gt; instance in the &lt;font face="Courier New"&gt;m_tfsServer&lt;/font&gt; field, and exposed through the &lt;font face="Courier New" size="2"&gt;TeamFoundationServer&lt;/font&gt; property:&lt;/p&gt;&lt;pre class="code"&gt;        &lt;span&gt;// This is our Team Foundation Server instance
&lt;/span&gt;        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;TeamFoundationServer&lt;/span&gt; m_tfsServer;

        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;
&lt;/span&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; This read-only property returns our current
&lt;/span&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; TeamFoundationServer instance
&lt;/span&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;
&lt;/span&gt;        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;TeamFoundationServer&lt;/span&gt; TeamFoundatonServer
        {
            &lt;span&gt;get&lt;/span&gt; { &lt;span&gt;return&lt;/span&gt; m_tfsServer; }
        }
&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;The &lt;font face="Courier New" size="2"&gt;TFSServer&lt;/font&gt; class offers three overloads for the &lt;font face="Courier New" size="2"&gt;Connect()&lt;/font&gt; method, as shown below:&lt;/p&gt;&lt;pre class="code"&gt;        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; Connect(&lt;span&gt;string&lt;/span&gt; serverName)
&lt;/pre&gt;&lt;pre class="code"&gt;        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; Connect(&lt;span&gt;string&lt;/span&gt; serverName, &lt;span&gt;NetworkCredential&lt;/span&gt; credentials)
&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;pre class="code"&gt;        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; Connect(&lt;span&gt;string&lt;/span&gt; serverName, &lt;span&gt;ICredentialsProvider&lt;/span&gt; credentialsProvider)
&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;The first overload does not take any type of credentials, and will use the &lt;font face="Courier New" size="2"&gt;UICredentialsProvider&lt;/font&gt; to pop up the connect dialog shown in the previous section. The other overloads either take a &lt;font face="Courier New" size="2"&gt;NetworkCredential&lt;/font&gt; or an object that implements &lt;font face="Courier New" size="2"&gt;ICredentialsProvider&lt;/font&gt;. After successfully connecting and authenticating, a reference to the &lt;font face="Courier New" size="2"&gt;TeamFoundationServer&lt;/font&gt; object instance is stored in the &lt;font face="Courier New" size="2"&gt;m_tfsServer&lt;/font&gt; field.&lt;/p&gt;
&lt;p&gt;The full implementations of the different &lt;font face="Courier New" size="2"&gt;Connect&lt;/font&gt; methods is shown below:&lt;/p&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// This overload of the Connect Method will prompt&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// the users for a set of credentials, by means of the&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// UICredentialsProvider. It then calls our "generic"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// connect method, which takes an ICredentialsProvider&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// as its second argument&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name="serverName"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; Connect(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; serverName)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Tracer(LoggingCategoryConstant.TFS_CONNECTIVITY_CONNECT))&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;//  Create an instance of our Creditials by means of the&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;//  UICredentialsProvider. Since we are using the &lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;//  UICredentialsProvider here, this  method will popup &lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;//  an authentication dialog for us and create a set &lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;//  of Credentials for us, which are passed to our other &lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;//  Connect overload that takes a generic &lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  20:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;//  ICredentialsProvider argument&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  21:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;// Create an instance of the UICredentialsProvider.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  22:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;// Note that creating this instance will automatically&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  23:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;// popup the TFS authentication dialog&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  24:&lt;/span&gt;         ICredentialsProvider provider = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; UICredentialsProvider();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  25:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; Connect(serverName, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; UICredentialsProvider());&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  26:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  27:&lt;/span&gt; } &lt;span style="color:#008000;"&gt;// method Connect&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  28:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  29:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  30:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// This overload of the Connect Method takes a NetworkCredential.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  31:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// This method is typically used from a server client, which does&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  32:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// not have the possibility to prompt the client for a username/password&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  33:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  34:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name="serverName"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  35:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name="credentials"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  36:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  37:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; Connect(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; serverName, NetworkCredential credentials)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  38:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  39:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Tracer(LoggingCategoryConstant.TFS_CONNECTIVITY_CONNECT))&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  40:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  41:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;//  Log our parameters&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  42:&lt;/span&gt;         addLogEntry(&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  43:&lt;/span&gt;             LoggingCategoryConstant.TFS_CONNECTIVITY_TRACE,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  44:&lt;/span&gt;             &lt;span style="color:#006080;"&gt;"Connect method with ServerName and Credentials Called"&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  45:&lt;/span&gt;             EventIdentifier.ConnectToTfs,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  46:&lt;/span&gt;             EventPriority.StandardPriority,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  47:&lt;/span&gt;             TraceEventType.Verbose,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  48:&lt;/span&gt;             createCredentialsContextInfo(serverName, credentials));&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  49:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  50:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;// Create our Network Credentials&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  51:&lt;/span&gt;         NetworkCredential credentials = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; NetworkCredential(TFSUserName, TFSPassword);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  52:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  53:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;// Here, we can pass the network credentials directly to the&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  54:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;// TeamFoundationServer constructor, so we have no need to used&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  55:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;// the factory here. You cannot use the factory methods with any &lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  56:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;// object instance that implements ICreditials, but it is supported&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  57:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;// in the standard constructor, as we are using it here&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  58:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  59:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  60:&lt;/span&gt;             m_tfsServer = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; TeamFoundationServer(serverName, credentials);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  61:&lt;/span&gt;             m_tfsServer.Authenticate();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  62:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  63:&lt;/span&gt;             &lt;span style="color:#008000;"&gt;//  If we succcessfully authenticated, we can go ahead an extract&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  64:&lt;/span&gt;             &lt;span style="color:#008000;"&gt;//  some reference to some commonly used service interfaces&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  65:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (m_tfsServer.HasAuthenticated)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  66:&lt;/span&gt;             {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  67:&lt;/span&gt;                 extractServiceInterfaces();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  68:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  69:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  70:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  71:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  72:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; rethrow = ExceptionPolicy.HandleException(ex, ExceptionPolicyName.EXTERNAL_LIBRARY_POLICY);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  73:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (rethrow)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  74:&lt;/span&gt;             {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  75:&lt;/span&gt;                 &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  76:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  77:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  78:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  79:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  80:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// Return the authentication status&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  81:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; m_tfsServer.HasAuthenticated;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  82:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  83:&lt;/span&gt; } &lt;span style="color:#008000;"&gt;// method Conection&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  84:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  85:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  86:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// This is our "generic" Connect method. This method takes any object &lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  87:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// instance that implements ICredentialsProvider. It uses the &lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  88:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// TeamFoundationServerFactory GetServer method to retrieve the &lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  89:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// TeamFoundationServer implementation&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  90:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  91:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name="serverName"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  92:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name="credentialsProvider"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  93:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  94:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; Connect(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; serverName, ICredentialsProvider credentialsProvider)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  95:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  96:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Tracer(LoggingCategoryConstant.TFS_CONNECTIVITY_CONNECT))&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  97:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  98:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;//  Log our parameters&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  99:&lt;/span&gt;         addLogEntry(&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 100:&lt;/span&gt;             LoggingCategoryConstant.TFS_CONNECTIVITY_TRACE,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 101:&lt;/span&gt;             &lt;span style="color:#006080;"&gt;"Connect method with ServerName and Credentials Called"&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 102:&lt;/span&gt;             EventIdentifier.ConnectToTfs,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 103:&lt;/span&gt;             EventPriority.StandardPriority,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 104:&lt;/span&gt;             TraceEventType.Verbose,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 105:&lt;/span&gt;             createCredentialsContextInfo(serverName, credentialsProvider));&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 106:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 107:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;// Create a TeamFoundationServer instance through the factory,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 108:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;// and authenticate&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 109:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 110:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 111:&lt;/span&gt;             m_tfsServer =&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 112:&lt;/span&gt;                 TeamFoundationServerFactory.GetServer(serverName, credentialsProvider);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 113:&lt;/span&gt;             m_tfsServer.Authenticate();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 114:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 115:&lt;/span&gt;             &lt;span style="color:#008000;"&gt;//  If we succcessfully authenticated, we can go ahead an extract&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 116:&lt;/span&gt;             &lt;span style="color:#008000;"&gt;//  some reference to some commonly used service interfaces&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 117:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (m_tfsServer.HasAuthenticated)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 118:&lt;/span&gt;             {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 119:&lt;/span&gt;                 extractServiceInterfaces();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 120:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 121:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 122:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 123:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 124:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; rethrow = ExceptionPolicy.HandleException(ex, ExceptionPolicyName.EXTERNAL_LIBRARY_POLICY);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 125:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (rethrow)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 126:&lt;/span&gt;             {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 127:&lt;/span&gt;                 &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 128:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 129:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 130:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 131:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 132:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// Return the authentication status&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 133:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; m_tfsServer.HasAuthenticated;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 134:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt; 135:&lt;/span&gt; } &lt;span style="color:#008000;"&gt;// method Connect&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;The first connect method uses the &lt;font face="Courier New" size="2"&gt;UICredentialsProvider&lt;/font&gt; class to retrieve the credentials from the user, and then calls the third overload of the &lt;font face="Courier New"&gt;Connect()&lt;/font&gt; method, which uses the &lt;font face="Courier New" size="2"&gt;TeamFoundationFactory.GetServer()&lt;/font&gt; method to connect to the Server, and the&lt;font face="Courier New" size="2"&gt; TeamFoundationServer'&lt;/font&gt;s &lt;font face="Courier New" size="2"&gt;Authenticate()&lt;/font&gt; method to authenticate with the server.&lt;/p&gt;
&lt;p&gt;The second &lt;font face="Courier New" size="2"&gt;Connect()&lt;/font&gt; overload accepts a &lt;font face="Courier New" size="2"&gt;NetworkCredential&lt;/font&gt;. Since the factory does not have an overload that takes an object that implement &lt;font face="Courier New" size="2"&gt;ICredentials&lt;/font&gt;, this method directly calls the &lt;font face="Courier New" size="2"&gt;TeamFoundationServer&lt;/font&gt; constructor, which does have an overload that accepts an &lt;font face="Courier New" size="2"&gt;ICredentials&lt;/font&gt; object instance.&lt;/p&gt;
&lt;p&gt;Also, note that after successfully connecting and authenticating to the TFS server, all overloads call the extractServiceInterfaces() private method. This method extracts all relevant service interfaces from the TeamFoundationServer instance, and cache them as fields of the class, as is shown below:&lt;/p&gt;&lt;pre class="code"&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;
&lt;/span&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; This method extract our most commonly used service interface
&lt;/span&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; from the TFS Server instance, and caches them in our private
&lt;/span&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; fields
&lt;/span&gt;        &lt;span&gt;///&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;
&lt;/span&gt;        &lt;span&gt;private&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; extractServiceInterfaces()
        {
            &lt;span&gt;if&lt;/span&gt; (m_tfsServer != &lt;span&gt;null&lt;/span&gt;)
            {
                m_commonStructureSvc = (&lt;span&gt;ICommonStructureService&lt;/span&gt;)m_tfsServer.GetService(&lt;span&gt;typeof&lt;/span&gt;(&lt;span&gt;ICommonStructureService&lt;/span&gt;));
                m_workItemStore = (&lt;span&gt;WorkItemStore&lt;/span&gt;)m_tfsServer.GetService(&lt;span&gt;typeof&lt;/span&gt;(&lt;span&gt;WorkItemStore&lt;/span&gt;));
                m_processTemplateSvc = (&lt;span&gt;IProcessTemplates&lt;/span&gt;)m_tfsServer.GetService(&lt;span&gt;typeof&lt;/span&gt;(&lt;span&gt;IProcessTemplates&lt;/span&gt;));
                m_eventService = (&lt;span&gt;IEventService&lt;/span&gt;)m_tfsServer.GetService(&lt;span&gt;typeof&lt;/span&gt;(&lt;span&gt;IEventService&lt;/span&gt;));
            }
        } &lt;span&gt;// method extractServiceInterfaces&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Note how we use the &lt;font face="Courier New" size="2"&gt;GetService(typeof(xxx))&lt;/font&gt; pattern to retrieve each interface and/or object references (only the &lt;font face="Courier New" size="2"&gt;WorkItemStore&lt;/font&gt; is a object reference, all the others are interface references).&lt;/p&gt;
&lt;h4&gt;Retrieving Project Information&lt;/h4&gt;
&lt;p&gt;... coming soon ... &lt;/p&gt;&lt;img src="http://footheory.com/aggbug.aspx?PostID=213" width="1" height="1"&gt;</content><author><name>bennie</name><uri>http://footheory.com/members/bennie.aspx</uri></author></entry><entry><title>An Introduction to Team Foundation Server Extensibility</title><link rel="alternate" type="text/html" href="http://footheory.com/blogs/bennie/archive/2007/11/07/an-introduction-to-team-foundation-server-extensibility.aspx" /><id>http://footheory.com/blogs/bennie/archive/2007/11/07/an-introduction-to-team-foundation-server-extensibility.aspx</id><published>2007-11-08T04:28:34Z</published><updated>2007-11-08T04:28:34Z</updated><content type="html">&lt;h3&gt;Introduction&lt;/h3&gt; &lt;p&gt;A large number of developers are using &lt;a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718825.aspx" target="_blank"&gt;Team Foundation Server&lt;/a&gt; for a variety of tasks such as Source Control, Bug Tracking, Requirements gathering, running nightly builds and managing the overall life cycle of a software development project.&lt;/p&gt; &lt;p&gt;Visual Studio Team System provides rich integration&amp;nbsp;with Team Foundation Server through &lt;a href="http://msdn2.microsoft.com/en-us/teamsystem/bb496794.aspx" target="_blank"&gt;Team Explorer&lt;/a&gt;, which provides the basic connectivity to TFS. Users can use&amp;nbsp;Source Control Management to manage their source code, manage Work Items, create&amp;nbsp;Build types,&amp;nbsp;run Unit Tests and Load Tests, run one of many SQL Server 2005 Reporting Services-based Team Reports etc.&lt;/p&gt; &lt;p&gt;In addition to Visual Studio, Office 2003 and Office 2007 also offer direct or indirect connectivity to Team Foundation Server. You can have Work Items show up as Tasks in Outlook 2007, you can export a Microsoft Project 2003 schedule to TFS, creating Work Items&amp;nbsp;in the process, or you can export and import your Work Items to and from Excel 2007.&lt;/p&gt; &lt;p&gt;Even if you are working outside of the realm of the &amp;nbsp;.NET and the Microsoft development platform, you can use the &lt;a href="http://www.teamprise.com/" target="_blank"&gt;TeamPrise&lt;/a&gt; plug-in for Eclipse to provide connectivity from your favorite Java development environment to Team Foundation Server.&lt;/p&gt; &lt;p&gt;What a lot of people don't realize is that Team Foundation Server also offers a&amp;nbsp;powerful development object model, empowering the developer to create custom development tools, specialized clients, custom WebParts for a Team Project SharePoint portal&amp;nbsp;and so on. Team Foundation Server was developed from the ground up with extensibility in mind. Indeed, TFS itself is build upon&amp;nbsp;the &lt;strong&gt;Team Foundation Core Services&lt;/strong&gt;, which are a set of Web Services used by Team Foundation Server itself to implement&amp;nbsp;the different functional areas&amp;nbsp;for Team Foundation Server.&lt;/p&gt; &lt;p&gt;As a developer, you will seldom have a reason to directly use the Team Foundation Core services. Indeed, Microsoft created the &lt;strong&gt;Team Foundation Server Object Model&amp;nbsp;&lt;/strong&gt;to&amp;nbsp;increase the productivity&amp;nbsp;of the TFS developer.&amp;nbsp;The classes in this object model interact with the Web Services of the&amp;nbsp;Team Foundation Server Core Services and make it easy for you to&amp;nbsp;extend the functionality&amp;nbsp;of Team Foundation Server in one of the following&amp;nbsp;ways:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Create a custom TFS command-line tool.  &lt;li&gt;Develop custom PowerShell cmdlets or PowerShell PSDrive&amp;nbsp;providers that allow you to directly navigate the TFS repository.  &lt;li&gt;Develop a SmartClient or Web client for Team Foundation Server.  &lt;li&gt;Develop a custom check-on policy for your development team  &lt;li&gt;Create a &amp;nbsp;plug-in for&amp;nbsp;a third-party development tool.  &lt;li&gt;Create a custom SharePoint WebPart for your Team Project SharePoint portal.  &lt;li&gt;Implement custom Contiguous Integration (CI)&amp;nbsp;tools.  &lt;li&gt;Create new Team Foundation build tasks.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;In article&amp;nbsp;two of this series we will create a custom class library, which will directly interface with the Team Foundation Object Model. We will create a set of Units Tests for the classes and methods in this library, and we will create a simple console client to navigate the object model.&lt;/p&gt; &lt;p&gt;In part&amp;nbsp;two of this article series, we will create a custom PowerShell &lt;font face="Courier New" size="2"&gt;PSDrive&lt;/font&gt; provider for TFS. This provider will allow us to navigate through the different artifacts in the TFS database, as if they were files and directories in the file system. We will be able to use the standard&lt;font face="Courier New" size="2"&gt; dir, cd, type&lt;/font&gt; etc. alias commands, together with the standard &lt;font face="Courier New" size="2"&gt;Get-ChildItem, Set-Location, Get-Content&lt;/font&gt;, etc..&amp;nbsp;&amp;nbsp;PowerShell cmdlets&amp;nbsp;to navigate&amp;nbsp;the TFS structure. The implementation of this provider will leverage the class library that we create in this post.&lt;/p&gt; &lt;p&gt;In the final post of this series, we will build a custom WPF client for Team Foundation Server, which will allow us to browse, edit and create Team Projects and Work Items. In the course of implementing this client, we will have an opportunity to dive into some interesting WPF features, such as data binding, data templates and control templates. We will also leverage the TFS eventing service to keep our UI synchronized with the TFS repository at all times.&lt;/p&gt; &lt;h3&gt;Extensibility versus Customization&lt;/h3&gt; &lt;p&gt;Before we dive into the details of the TFS extensibility model, I would like to clarify some terms that tend to lead to confusion in the community. These terms are:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Customization&lt;/strong&gt;. Customization involves modifying your environment, such as Visual Studio Team System or Team Foundation Sever, using the tools that are provided to you by that environment. It is important to note that there&amp;nbsp;is no real coding involved in customization. Indeed, before you go fire up Visual Studio to write custom code to perform a certain task, I would encourage you to check out the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=2aed0ecc-1552-49f1-abe7-4905155e210a&amp;amp;displaylang=en" target="_blank"&gt;Team Foundation Administrator's Guide&lt;/a&gt; in the Team Foundation Help documentation. In a lot of cases, you will notice that you can customize your TFS environment by using the existing toolset, or by simply modifying&amp;nbsp;one or more of XML files. Also, I would encourage you to download the &lt;a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718351.aspx" target="_blank"&gt;Team Foundation Server Power Toys&lt;/a&gt;, which extend the reach of the existing TFS toolset even further. Customization might include:  &lt;ul&gt; &lt;li&gt;Modifying a Process Template.  &lt;li&gt;Creating a new Work Item Type.  &lt;li&gt;Customizing Team Foundation Build.  &lt;li&gt;Modifying the Project Portal Template  &lt;li&gt;Turning check-in policies on or off.&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;&lt;strong&gt;Extensibility&lt;/strong&gt;. Extensibility is concerned with adding new functionality to your environment, which typically does involve coding. You can extend a Team Foundation Server installation by writing code to access the Team Foundation Server object model.&amp;nbsp;This way you can build add-ins and integration components that round out the Team Foundation Server product line. TFS Extensions are typically created by internal IT departments or third-party independent software vendors (ISV's). Some extensibility examples are:  &lt;ul&gt; &lt;li&gt;An adapter that integrates an existing toolset with Team Foundation Server. A good example is the &lt;a href="http://www.teamprise.com/" target="_blank"&gt;TeamPrise&lt;/a&gt; plug-in for the Java Eclipse development environment. &lt;li&gt;A Customized Team Foundation Server development solution for a vertical industry (for example Healthcare-specific process templates, new Work Item Types with Healthcare-specific workflows etc.). &lt;li&gt;Custom explorer clients (like the one we will be developing in part II of this series).&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Our focus of this series is on &lt;strong&gt;extensibility.&lt;/strong&gt; I do have some ideas for&amp;nbsp;future posts on TFS customization, so make sure you subscribe to our RSS feed!&lt;/p&gt; &lt;h3&gt;The Team Foundation Core Services&lt;/h3&gt; &lt;p&gt;The Team Foundation Core Services (&lt;font face="Courier New" size="2"&gt;TFCS&lt;/font&gt;) are a set of services running on the Application Tier of TFS, which allow us to access the different aspects of Team Foundation Server, including administration, security and events. &lt;font face="Courier New" size="2"&gt;TFCS&lt;/font&gt; enable customers and Microsoft Partners to extend Team Foundation functionality by developing Team System extensions and adapters to integrate third-party tools with Team System.&lt;/p&gt; &lt;p&gt;TFCS is made up our of five services:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Classification Service&lt;/strong&gt;. This service provides access to Team Project information, and the different structures that make up a Team Project.&amp;nbsp;In this article, we will mainly be focusing on this service.  &lt;li&gt;&lt;strong&gt;Eventing Service&lt;/strong&gt;. The Eventing Service allows Team Foundation Servers to communicate by raising events and listening for events. This is how tools like &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET" target="_blank"&gt;CruiseControl.Net&lt;/a&gt; are able to kick of a build in response to a check in. They use the Eventing Service to listen for these events, and react appropriately. We will use the Eventing service in our custom WCF client, to keep our displayed information synchronized with the TFS repository at all times. &lt;li&gt;&lt;strong&gt;Linking Service&lt;/strong&gt;. This service provides the ability to link items together, such as Work Items and files that are version controlled. One interesting aspect of the Linking Service is that you can create a link between two artifacts that were created by different tools which have no knowledge of each other. This type of loose coupling is achieved by assigning Uri to each artifact in the TFS repository, and creating links between these Uri's. &lt;li&gt;&lt;strong&gt;Registration Service&lt;/strong&gt;. The Registration Service allows a TFS component to discover other services registered on Team Foundation Server. Therefore, when you create a new TFS service, it should be registered on the service by using the Registration Service, so that it can be found and utilized by the other server components. You&amp;nbsp;can compare the Registration Service to a UDDI registry for Web Services. &lt;li&gt;&lt;strong&gt;Security Service&lt;/strong&gt;. The security service implements a unified security model used by Team Foundation Server to manage users, groups and permissions. If you create a custom TFS component, you have the ability to integrate your extension into this security model, and have your artifacts behave correctly within the TFS security model.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;The above services are implemented as Web Services. Team Explorer and the different components of Team Foundation use the above services to implement their functionality. As I mentioned before, you will not often have a reason to call these web services directly. Instead, you will use&amp;nbsp; the &lt;strong&gt;Team Foundation Object Model&lt;/strong&gt; to interact with these Core Services. This is what we will do to implement our Console, WCF and PowerShell clients.&lt;/p&gt; &lt;p&gt;An overview diagram is shown below:&lt;/p&gt; &lt;p&gt;&lt;a title="TFSObjectModelOverview" href="http://www.flickr.com/photos/99548241@N00/1810347928/"&gt;&lt;img alt="TFSObjectModelOverview" src="http://static.flickr.com/2142/1810347928_b2d74b88af.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;In the next sections, we will take a more detailed look at the Classification Service. Future articles will take a look at the other services within the context of the overall article.&lt;/p&gt; &lt;h3&gt;The Classification Service&lt;/h3&gt; &lt;p&gt;&amp;nbsp;The classification service provides access to Team Project information, including the Team Project name and the Uri, as well as access to the areas and iterations of the project. The Area and Iterations sections of a Team Project form the structure of the project. This service allows you to view project information, and make changes to a project's structure. An example of using this service would be to populate the top nodes of a tree view that looks like the main tree view of team explorer, showing the names of all of the Team Projects on the server. From these nodes you could then use other services to create the other nodes in the tree (such as accessing the Work Items that belong to a Team Project, which is what we will be doing in our custom WCF client).&lt;/p&gt; &lt;p&gt;Some example of the services offered up by the Classification Servers are listed below:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Creating a new Team Project.  &lt;li&gt;Delete an existing Team Project.  &lt;li&gt;Access the&amp;nbsp;properties (name, Uri, process template Id and Project properties) of the Team Project.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The common pattern for accessing the object model is to first establish a connection to the server Once you have a connection to the server, you can query the server for the type of interface you would like to use. This model is not unlike the WF Runtime Model, where you can ask the Workflow Runtime for the different services, such as the persistence or threading service.&lt;/p&gt; &lt;p&gt;To access the Classificiation service, you query the server for the &lt;font face="Courier New" size="2"&gt;ICommonStructureService&lt;/font&gt; type, defined in the &lt;font face="Courier New" size="2"&gt;Microsoft.TeamFoundation.Server&lt;/font&gt; namespace in the &lt;font face="Courier New" size="2"&gt;Microsoft.TeamFoundation.Server.dll&lt;/font&gt; assembly.&lt;/p&gt; &lt;p&gt;In my next post, we will dive head-first into the Classification service, and the &lt;font face="Courier New" size="2"&gt;TeamFoundationServer&lt;/font&gt; object, which is at the root of the Team Foundation Object Model hierarchy.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:b6ea5f5c-152c-4afb-a6c7-698327731c22" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Team%20Foundation%20Server" rel="tag"&gt;Team Foundation Server&lt;/a&gt;, &lt;a href="http://technorati.com/tags/TFS" rel="tag"&gt;TFS&lt;/a&gt;, &lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;, &lt;a href="http://technorati.com/tags/Team%20Explorer" rel="tag"&gt;Team Explorer&lt;/a&gt;, &lt;a href="http://technorati.com/tags/TeamPrise" rel="tag"&gt;TeamPrise&lt;/a&gt;&lt;/div&gt;&lt;img src="http://footheory.com/aggbug.aspx?PostID=209" width="1" height="1"&gt;</content><author><name>bennie</name><uri>http://footheory.com/members/bennie.aspx</uri></author></entry><entry><title>Code for"Writing Custom Cmdlets for Windows PowerShell" now available in the Downloads Section</title><link rel="alternate" type="text/html" href="http://footheory.com/blogs/bennie/archive/2007/10/07/code-for-writing-custom-cmdlets-for-windowns-powershell-now-available-in-the-downloads-section.aspx" /><id>http://footheory.com/blogs/bennie/archive/2007/10/07/code-for-writing-custom-cmdlets-for-windowns-powershell-now-available-in-the-downloads-section.aspx</id><published>2007-10-08T00:43:39Z</published><updated>2007-10-08T00:43:39Z</updated><content type="html">&lt;p&gt;The code for the article &lt;a href="http://footheory.com/blogs/bennie/archive/2007/09/24/writing-custom-cmdlets-for-windows-powershell.aspx" target="_blank"&gt;Writing Custom Cmdlets for Windows PowerShell&lt;/a&gt; is now available in the &lt;a href="http://footheory.com/files/folders/powershell/entry192.aspx" target="_blank"&gt;download&lt;/a&gt; section. The sample includes the code for the cmdlet itself, the unit tests, and a&amp;nbsp; class library with a sample pipeline input object.&lt;/p&gt; &lt;p&gt;Any feedback on either the article or the code is greatly appreciated!&lt;/p&gt;&lt;img src="http://footheory.com/aggbug.aspx?PostID=193" width="1" height="1"&gt;</content><author><name>bennie</name><uri>http://footheory.com/members/bennie.aspx</uri></author></entry><entry><title>Writing custom Cmdlets for Windows PowerShell</title><link rel="alternate" type="text/html" href="http://footheory.com/blogs/bennie/archive/2007/09/24/writing-custom-cmdlets-for-windows-powershell.aspx" /><id>http://footheory.com/blogs/bennie/archive/2007/09/24/writing-custom-cmdlets-for-windows-powershell.aspx</id><published>2007-09-25T03:54:30Z</published><updated>2007-09-25T03:54:30Z</updated><content type="html">&lt;h3&gt;Article Overview&lt;/h3&gt; &lt;p&gt;In this article we will take a look at how to write a custom cmdlet for Windows PowerShell, which is the new command shell from Microsoft (formerly called "Monad").&amp;nbsp;Our cmdlet named "&lt;font face="Courier New" size="2"&gt;Get-Contact&lt;/font&gt;" will have the ability to retrieve contacts defined in Outlook 2007.&lt;/p&gt; &lt;p&gt;The full source code, inlcuding unit tests, installations scripts etc. can be found &lt;a href="http://footheory.com/files/folders/powershell/entry192.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The contents of this post is as follows:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;In the first section, we will take a&amp;nbsp;quick look at&amp;nbsp;PowerShell. We look at the main drivers behind it's creation and&amp;nbsp;what some of the key factors are that differentiate PowerShell from other well-known shells and scripting environments.  &lt;li&gt;In the second section,we tell you how to download PowerShell&amp;nbsp;if you don't have it installed yet (shame on you! ;-), and take a quick look at the PowerShell Extensions (PCX)&amp;nbsp;library, which is an open-source project for writing custom PowerShell extensions.  &lt;li&gt;Next we take a look at&amp;nbsp;PowerShell cmdlets, we'll show some examples, and&amp;nbsp;discuss Microsoft's naming standards.  &lt;li&gt;Once we have a good understanding of cmdlets, we talk about the PowerShell SDK, and the PowerShell extension templates, which allow you to quickly get the "shell" (pun intended ;-) of a custom cmdlet up and running quickly.  &lt;li&gt;Before we start the implementation of our cmdlet, I thought it would be a good idea to list the detailed requirements of our &lt;font face="Courier New" size="2"&gt;Get-Contact&lt;/font&gt; cmdlet, and lists its parameters and arguments.  &lt;li&gt;Since we will be interacting with Microsoft Outlook 2007,&amp;nbsp;we will make sure that you have the new Outlook 2007 Primary Interop Assembly installed. If not, I will walk you through the process of downloading and installing the PIA.  &lt;li&gt;Once we have all these pre-requisites out of the way, we will finally be able to start writing the code of our cmdlet.  &lt;li&gt;Finally, we'll write some scripts that test the functionality of our new cmdlet.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;That quite a long list that we have here, so let's get rolling!&lt;/p&gt; &lt;h3&gt;Microsoft PowerShell Overview&lt;/h3&gt; &lt;p&gt;Windows PowerShell is the new command line and scripting language for Windows environments. While it has been designed and optimized for Windows, it is based on a rich shell heritage that stretches all the way back to the original Unix shells such as "&lt;font face="Courier New" size="2"&gt;csh&lt;/font&gt;", "&lt;font face="Courier New" size="2"&gt;ksh&lt;/font&gt;", and the more recent "&lt;font face="Courier New" size="2"&gt;bash&lt;/font&gt;" (the "&lt;strong&gt;B&lt;/strong&gt;orne &lt;strong&gt;A&lt;/strong&gt;gain &lt;strong&gt;SH&lt;/strong&gt;ell"). Jeffrey Snover (the Windows PowerShell architect) and Bruce Payette (the lead designer of the language) both have a very extensive dynamic language background, and have been involved in the creation of a variety of command shells.&lt;/p&gt; &lt;p&gt;In this book "&lt;a href="http://www.manning.com/payette/" target="_blank"&gt;Powershell in Action&lt;/a&gt;" (which I highly recommend), Bruce Payette states that the overall goal of the PowerShell project was to &lt;em&gt;provide the best shell scripting environment possible for Microsoft Windows&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;I have yet to find somebody who really loved the old Windows Command line (&lt;font face="Courier New" size="2"&gt;cmd.exe&lt;/font&gt;). Maybe I should check some mental health institutions, because that's where some folks could have ended up if they tried to do some advanced scripting tasks with &lt;font face="Courier New" size="2"&gt;cmd.exe&lt;/font&gt;. All joking aside, as Bruce says in his book, the focus of Windows was always on the GUI and the average user, and not necessarily the computer professional and/or the systems administrator.&lt;/p&gt; &lt;p&gt;Initially, Microsoft created GUI tools (such as &lt;font face="Courier New" size="2"&gt;mmc.exe&lt;/font&gt;) to administer desktops and servers. But now that the power of the PC has increased, Windows is used in the corporate data center as well as on the user's desktop. In such a data center, the graphical point-and-click management approach that worked well for one machine does not quite scale. This limitation&amp;nbsp;illustrates the need for a powerful, command-line based scripting environment.&lt;/p&gt; &lt;p&gt;The starting point for the PowerShell language was the grammar for the POSIX standard shell defined in &lt;a href="http://docs.babitch.com/O'Reilly/unix/ksh/appa_02.htm" target="_blank"&gt;IEEE specification 1003.2&lt;/a&gt;. One of the main enriching features that Microsoft added to this starting point was support for object-orientation. Indeed, PowerShell is the first fully object-oriented shell out there. I think that everybody is familiar with the typical "command pipeline" for command shells. In traditional scripting environment, only text is flowing through the pipeline from one command to the next. In PowerShell we&amp;nbsp;have &lt;strong&gt;OBJECTS&lt;/strong&gt; flowing between commands, so none of the semantics of the objects produced and consumed on either end of the pipeline are lost.&lt;/p&gt; &lt;p&gt;This also implies that PowerShell is fully compatible with the&amp;nbsp;.NET type system. Actually, the .NET object model IS the object model in PowerShell, eliminating any&amp;nbsp;impedance mismatch between the two. Because of this, PowerShell can leverage the intellectual capital captured in the vast universe of .NET code, including the&amp;nbsp;.NET Base&amp;nbsp;Class Library (BCL), and any other third-party&amp;nbsp;.NET code.&amp;nbsp;PowerShell also fully supports COM interoperability, ensuring us that we will be able to leverage any past investments in the COM and COM+ arena.&lt;/p&gt; &lt;h3&gt;Installing PowerShell and the PCX Extensions&lt;/h3&gt; &lt;p&gt;Windows Server 2008 will ship with PowerShell "in the box". You will also have PowerShell installed on any server that has a product installed that leverages PowerShell for it's administration implementation, such as:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Exchange Server 2007.  &lt;li&gt;VMM (Virtual Machine Manager).  &lt;li&gt;Desktop Protection Manager.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Otherwise, you should first download PowerShell from &lt;a href="http://www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx" target="_blank"&gt;this site&lt;/a&gt;.&amp;nbsp;Running the installer is very straightforward, and only takes a couple of minutes. After the installation completes successfully, you can start an interactive PowerShell session as follows:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;Start -&amp;gt; Programs -&amp;gt; Windows PowerShell&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;You also would want to download the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=B4720B00-9A66-430F-BD56-EC48BFCA154F&amp;amp;displaylang=en" target="_blank"&gt;Windows PowerShell 1.0 documentation pack&lt;/a&gt;.&amp;nbsp; It contains several documents ("Release Notes", a one page "Quick Reference" etc), but what I like the most is the "Windows PowerShell Primer", which is about 100 pages, and a good place to get started with PowerShell.&lt;/p&gt; &lt;p&gt;Next, I recommend that you download the &lt;a href="http://www.codeplex.com/PowerShellCX" target="_blank"&gt;PowerShell Community Extension (PCX)&lt;/a&gt; from CodePlex. This is a very useful set of cmdlets, providers, aliases, filters, functions and scripts that members in the beta-testing community had expressed interest in, but never made it into PowerShell v1.0. The functionality covers a wide number of areas, including:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Compression (zip, tar etc.) functionality.  &lt;li&gt;A wide variety of XML extensions.  &lt;li&gt;Clipboard functionality.  &lt;li&gt;SMTP support.  &lt;li&gt;Terminal Session support.&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;PowerShell Cmdlets&lt;/h3&gt; &lt;p&gt;A &lt;strong&gt;cmdlet&lt;/strong&gt; is basically a lightweight command in the PowerShell language. I added the term "lightweight" here, because a cmdlet will NOT create a new process or &lt;font face="Courier New" size="2"&gt;AppDomain&lt;/font&gt;. Instead it&amp;nbsp; runs in the default &lt;font face="Courier New" size="2"&gt;AppDomain&lt;/font&gt; of the PowerShell process. When you compare a cmdlet to a "traditional shell command", such as a command in the Unix "C Shell (&lt;font face="Courier New" size="2"&gt;csh&lt;/font&gt;)", you will notice that they differ in the following ways:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Cmdlets are instances of .NET classes, not stand-alone executables. This also implies that when we execute a cmdlet, we do not have to incur the overhead of process creation.  &lt;li&gt;Cmdlets are very easy to write in any .NET language.  &lt;li&gt;Cmdlets will typically not do their own parsing, error presentation or output formatting. Parsing, error presentation, and output formatting are handled by the Windows PowerShell runtime. This also guarantees consistency and ease of integration into new scripts. The advantages of this cannot be overstated. When you implement your custom cmdlet (as we will do shortly), you can use simple attributes to identify a property as a cmdlet argument, define whether it's a positional or named arguments, state that the parameter should support wildcards etc., without the need to do any extra programming.  &lt;li&gt;Cmdlets process input &lt;strong&gt;objects&lt;/strong&gt; from the pipeline rather than from streams of text, and they typically deliver objects as output to the pipeline. This goes back to the fact that PowerShell is really a fully object-oriented shell.  &lt;li&gt;Cmdlets are record-oriented, processing a single object at a time. The PowerShell pipeline supports streaming, which improves performance, and limits user wait times, because the command on the right side of the pipeline can start processing the records produced by the left-side command as soon as they become available.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;PowerShell uses a verb-noun pair for the names of cmdlets. For example, the &lt;font face="Courier New" size="2"&gt;Get-Process &lt;/font&gt;cmdlet built into PowerShell is used to retrieve a list of all processes that are current running on the host computer. The verb part ("&lt;font face="Courier New" size="2"&gt;Get&lt;/font&gt;") of the name identifies that action that the cmdlet performs. The noun part ("&lt;font face="Courier New" size="2"&gt;Process&lt;/font&gt;") of the name identifies the entity on which the action is performed (in this case, one or more Windows Processes).&lt;/p&gt; &lt;p&gt;Microsoft recommends that you follow the following naming rules when creating a new cmdlet:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;When specifying the verb part of the name, it is strongly recommended that you use one of the predefined verb names provided by Windows PowerShell (as defined by the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.management.automation.verbscommon.aspx" target="_blank"&gt;VerbsCommon&lt;/a&gt; enumeration). If you use these standards names, you will ensure consistency between the cmdlets that you create, and those provided by Microsoft, or third-parties, such as PCX.  &lt;li&gt;Use only the present tense of a verb for a name. For example, use "&lt;font face="Courier New" size="2"&gt;Set&lt;/font&gt;" instead of "&lt;font face="Courier New" size="2"&gt;Setting&lt;/font&gt;".  &lt;li&gt;To enforce consistency, do not use a synonym of an approved verb name. (or in other words, don't get creative ;-)!  &lt;li&gt;Always use a simple, singular noun in cmdlet naming. For example, use "&lt;font face="Courier New" size="2"&gt;Get-Database&lt;/font&gt;" instead of "&lt;font face="Courier New" size="2"&gt;Get-Databases&lt;/font&gt;". While this might seem a bit strange at first it makes sense, because cmdlets might return either a single object or a collection, and you don't want to use different cmdlet names for both situations. So, Microsoft selected the singular name and used it consistently.  &lt;li&gt;Use Pascal Casing for both verb and noun names.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;The &lt;a href="http://msdn2.microsoft.com/en-us/library/ms714428.aspx" target="_blank"&gt;verb names page&lt;/a&gt; of the PowerShell SDK lists the common verbs defined in the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.management.automation.verbscommon.aspx" target="_blank"&gt;VerbsCommon&lt;/a&gt; enumeration.&lt;/p&gt; &lt;h3&gt;The PowerShell SDK&lt;/h3&gt; &lt;h4&gt;Ensuring that you have the SDK installed&lt;/h4&gt; &lt;p&gt;The &lt;a href="http://msdn2.microsoft.com/en-us/library/ms714469.aspx" target="_blank"&gt;PowerShell SDK&lt;/a&gt; is an integral part of the Windows SDK. It consists out of a class library, documentation and tools which allow you to create:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;em&gt;Custom cmdlets&lt;/em&gt; (which is the topic of&amp;nbsp;this article).  &lt;li&gt;&lt;em&gt;Custom PowerShell Providers&lt;/em&gt; (a PowerShell Provider allows you to navigate or browse a set of stored data, using a consistent set of cmdlets such as &lt;font face="Courier New" size="2"&gt;Get-Item, Set-Item, Copy-Item, Get-ChildItem&lt;/font&gt; etc.). This is something we might touch on in a future article.  &lt;li&gt;&lt;em&gt;Custom PowerShell hosts&lt;/em&gt;. Your application can act as a host to PowerShell, and invoke command pipelines directly from the host. This is the approach used by the admin UI of applications such as Exchange 2007.  &lt;li&gt;&lt;em&gt;Create custom PowerShell &lt;/em&gt;&lt;font face="Courier New" size="2"&gt;&lt;em&gt;Runspaces&lt;/em&gt;. Runspaces&lt;/font&gt; provide the mechanisms that hosting application use to execute pipelines in a well-constructed, consistent manner, and are often used by custom PowerShell hosts.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;If you have downloaded the Windows SDK, you will have the PowerShell SDK installed. If you don't have the Windows SDK installed, well, what are you waiting for? ;-). You can download the Windows SDK for Windows Vista and the .NET framework 3.0 from &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=C2B1E300-F358-4523-B479-F53D234CDCCF&amp;amp;displaylang=en" target="_blank"&gt;this&lt;/a&gt; location.&lt;/p&gt; &lt;p&gt;After installation, you can find a large number of samples in the directory (if you used the standard installation directory):&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;C:\Program Files\Microsoft SDKs\Windows\v6.0\Samples\SysMgmt\WindowsPowerShell&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Examples for each of the categories of custom objects are included in this directory.&lt;/p&gt; &lt;h4&gt;The Windows PowerShell Extension Templates for Visual Studio&lt;/h4&gt; &lt;p&gt;These &lt;a href="http://channel9.msdn.com/ShowPost.aspx?PostID=256835" target="_blank"&gt;Visual Studio templates&lt;/a&gt; add a C# and VB.NET project template for building Windows PowerShell cmdlets and providers. Using these templates will save you a lot of startup time, they will add the correct references to your project, create a skeleton for your custom cmdlet or provider, and add a generated &lt;font face="Courier New" size="2"&gt;PSSnapIn&lt;/font&gt; class for you to your project&amp;nbsp;(we will talk more about &lt;font face="Courier New" size="2"&gt;PSSnapIn&lt;/font&gt; classes in the next section). After you download and unzip the files, you will get a .&lt;font face="Courier New" size="2"&gt;vsi&lt;/font&gt; file for C# and VB.NET, as is shown below:&lt;/p&gt; &lt;p&gt;&lt;a title="VisualStudioPowerShellTemplates" href="http://www.flickr.com/photos/99548241@N00/1450231843/"&gt;&lt;img alt="VisualStudioPowerShellTemplates" src="http://static.flickr.com/1016/1450231843_34aa51ae62.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Run the template of your choice, for example the C# template. You will see the following selection screen:&lt;/p&gt; &lt;p&gt;&lt;a title="VSPowerShellTemplateInstall" href="http://www.flickr.com/photos/99548241@N00/1451102162/"&gt;&lt;img alt="VSPowerShellTemplateInstall" src="http://static.flickr.com/1160/1451102162_96731a1f13.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Leave all options selected. After you click &lt;strong&gt;Next&lt;/strong&gt;, you will get a warning dialog, informing you that the content of the install package is not signed:&lt;/p&gt; &lt;p&gt;&lt;a title="VSTemplatesPowerShellInstallWarning" href="http://www.flickr.com/photos/99548241@N00/1450251503/"&gt;&lt;img alt="VSTemplatesPowerShellInstallWarning" src="http://static.flickr.com/1350/1450251503_5b671c41a3.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Click &lt;strong&gt;Yes&lt;/strong&gt;, and the install will continue. In the next screen, click &lt;strong&gt;Finish&lt;/strong&gt; to the install&amp;nbsp;the template:&lt;/p&gt; &lt;p&gt;&lt;a title="VSTemplatesPowerSHellInstallReady" href="http://www.flickr.com/photos/99548241@N00/1450262779/"&gt;&lt;img alt="VSTemplatesPowerSHellInstallReady" src="http://static.flickr.com/1048/1450262779_3d02282073.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The install will complete and we'll be ready to start coding. Click &lt;strong&gt;Close&lt;/strong&gt; to close the install dialog box:&lt;/p&gt; &lt;p&gt;&lt;a title="VsTemplatesPowerShellInstallComplete" href="http://www.flickr.com/photos/99548241@N00/1450272273/"&gt;&lt;img alt="VsTemplatesPowerShellInstallComplete" src="http://static.flickr.com/1069/1450272273_88cf131ee3.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;After the installation has been completed, you will now have a &lt;strong&gt;PowerShell&lt;/strong&gt; option in the &lt;strong&gt;New Project&lt;/strong&gt; dialog:&lt;/p&gt; &lt;p&gt;&lt;a title="PowerShellTemplateInVisualStudio" href="http://www.flickr.com/photos/99548241@N00/1450280677/"&gt;&lt;img alt="PowerShellTemplateInVisualStudio" src="http://static.flickr.com/1365/1450280677_382d6750e7.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;The Get-Contact cmdlet - Detailed Requirements&lt;/h3&gt; &lt;p&gt;The Get-Contact cmdlet should retrieve the list of contact defined in the local instance of Microsoft Outlook 2007. If no parameters are specified, it should return the entire list of contacts. The instances returned should be of type &lt;font face="Courier New" size="2"&gt;Microsoft.Office.Interop.Outlook.ContactItem&lt;/font&gt;. This type is defined in the Microsoft Outlook 2007 PIA.&lt;/p&gt; &lt;p&gt;The user should be able to restrict the list of contacts returned by last name. A &lt;font face="Courier New" size="2"&gt;LastName&lt;/font&gt; parameter should be provided for this purpose. This parameter should be able to accept a single argument, or a list of arguments, as shown in the examples below:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:86df4767-d26d-403a-9f6a-8cfe2bf70832" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#AEAEFF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;13&lt;/span&gt;&lt;span style="color:#000000;"&gt;# Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Contact &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;LastName Hensel &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; Format&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Table FirstName, LastName, CompanyName &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;AutoSize

FirstName LastName CompanyName
&lt;/span&gt;&lt;span style="color:#000000;"&gt;---------&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;--------&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-----------&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Brian     Hensel   Stat&amp;#234;ra


&lt;/span&gt;&lt;span style="color:#000000;"&gt;14&lt;/span&gt;&lt;span style="color:#000000;"&gt;# Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Contact &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;LastName Hensel, Banker, Felker &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; Format&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Table FirstName, LastName, CompanyName &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;AutoSize

FirstName LastName CompanyName
&lt;/span&gt;&lt;span style="color:#000000;"&gt;---------&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;--------&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-----------&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Brian     Hensel   Stat&amp;#234;ra
Chris     Banker   Stat&amp;#234;ra
Donn      Felker   Stat&amp;#234;ra&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The &lt;font face="Courier New" size="2"&gt;LastName&lt;/font&gt; parameter should be positional and optional, so the previous command could also be written as follows:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:ac21d221-84e3-46a7-bb19-f7c7b858d31f" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#B3B3FF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;15&lt;/span&gt;&lt;span style="color:#000000;"&gt;# Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Contact Hensel, Banker, Felker &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; Format&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Table FirstName, LastName, CompanyName &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;AutoSize

FirstName LastName CompanyName
&lt;/span&gt;&lt;span style="color:#000000;"&gt;---------&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;--------&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-----------&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Brian     Hensel   Stat&amp;#234;ra
Chris     Banker   Stat&amp;#234;ra
Donn      Felker   Stat&amp;#234;ra&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;The LastName parameter should also&amp;nbsp;be able to accept wildcards. The syntax should be in accordance to the &lt;a href="http://msdn2.microsoft.com/en-us/library/aa717088.aspx" target="_blank"&gt;PowerShell wildcard specification&lt;/a&gt;. Below are a number of examples:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:d27108e6-5482-4832-ba0b-acdfe5258c70" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#AAAAFF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;24&lt;/span&gt;&lt;span style="color:#000000;"&gt;# Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Contact B&lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; Format&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Table FirstName, LastName, Email1Address &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;AutoSize

FirstName LastName Email1Address
&lt;/span&gt;&lt;span style="color:#000000;"&gt;---------&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;--------&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-------------&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Eric      Boocock  &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;eboocock
Malcolm   Boswell  &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;STATORG&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;FIRST ADMINISTRATIVE GROUP&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;RECIPIENTS&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;MBOSWELL
Chris     Banker   &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;cbanker
Tony      Blodgett &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;tblodgett


&lt;/span&gt;&lt;span style="color:#000000;"&gt;25&lt;/span&gt;&lt;span style="color:#000000;"&gt;# Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Contact [CE]&lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; Format&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Table FirstName, LastName, Email1Address &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;AutoSize

FirstName LastName Email1Address
&lt;/span&gt;&lt;span style="color:#000000;"&gt;---------&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;--------&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-------------&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Jeremy    Campbell &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;jcampbell
Erl       Egestad  &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;eegestad
Julie     Clint    &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;jclint
Mike      Citro    &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;mcitro


&lt;/span&gt;&lt;span style="color:#000000;"&gt;26&lt;/span&gt;&lt;span style="color:#000000;"&gt;# Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Contact [m&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;x]&lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; Format&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Table FirstName, LastName, Email1Address &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;AutoSize

FirstName LastName  Email1Address
&lt;/span&gt;&lt;span style="color:#000000;"&gt;---------&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;--------&lt;/span&gt;&lt;span style="color:#000000;"&gt;  &lt;/span&gt;&lt;span style="color:#000000;"&gt;-------------&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Matthew   Ortiz     &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;mortiz
Kyle      Sanford   ksanford@statera.com
Wayne     Macdonald &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;wmacdonald
Bob       Mills     Bob_Mills@isagenix.net
Pete      Miller    &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;pmiller
Jon       Robinson  jRobinson@statera.com&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;From the above list, you also notice that the wildcard expansion should be case-insensitive.&lt;/p&gt;
&lt;h3&gt;The Outlook 2007 Primary Interop Assembly &lt;/h3&gt;
&lt;p&gt;The Microsoft Office Outlook Primary Interop Assembly (PIA) allows a developer to write managed applications for Microsoft Office Outlook 2007. The name of the assembly is &lt;font face="Courier New" size="2"&gt;Microsoft.Office.Interop.Outlook.dll&lt;/font&gt;. To check if you already have this assembly installed in the GAC, open up File Explorer, and navigate to&lt;font face="Courier New" size="2"&gt; %WINDIR\Assembly&lt;/font&gt;, and check if the assembly is already loaded in the GAC:&lt;/p&gt;
&lt;p&gt;&lt;a title="Outlook200PIAGAC" href="http://www.flickr.com/photos/99548241@N00/1499502230/"&gt;&lt;img alt="Outlook200PIAGAC" src="http://static.flickr.com/2162/1499502230_2e17c3e09a.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Or, for the hard-core PowerShell fans, you can use the following command:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:befccfdc-38ce-4f5d-a0b4-158993d775b1" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#B3B3FF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;51&lt;/span&gt;&lt;span style="color:#000000;"&gt;# dir $env:windir\assembly\gac\Microsoft.Office.Interop.Outlook


    Directory: Microsoft.PowerShell.Core\FileSystem::C:\Windows\assembly\gac\Microsoft.Office.Interop.Outlook


Mode           LastWriteTime       Length Name
&lt;/span&gt;&lt;span style="color:#000000;"&gt;----&lt;/span&gt;&lt;span style="color:#000000;"&gt;           &lt;/span&gt;&lt;span style="color:#000000;"&gt;-------------&lt;/span&gt;&lt;span style="color:#000000;"&gt;       &lt;/span&gt;&lt;span style="color:#000000;"&gt;------&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;----&lt;/span&gt;&lt;span style="color:#000000;"&gt;
d&lt;/span&gt;&lt;span style="color:#000000;"&gt;----&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;12&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;16&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;2006&lt;/span&gt;&lt;span style="color:#000000;"&gt;  &lt;/span&gt;&lt;span style="color:#000000;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#000000;"&gt;58&lt;/span&gt;&lt;span style="color:#000000;"&gt; AM        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;DIR&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;12.0&lt;/span&gt;&lt;span style="color:#000000;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;.0__71e9bce111e9429c&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;(note how we use the &lt;font face="Courier New" size="2"&gt;$env:windir&lt;/font&gt; environment variable to refer to the windows directory, this is basically equivalent to using &lt;font face="Courier New" size="2"&gt;%WINDIR%&lt;/font&gt; in &lt;font face="Courier New" size="2"&gt;cmd.exe, but of cour much "cooler" ;-&lt;/font&gt;).&lt;/p&gt;
&lt;p&gt;If you DO NOT see see the Outlook PIA using the mechanisms illustrated above, follow the instructions listed below to install it (note: these steps are for Windows Vista, but should be very similar for Windows XP):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bring up Control Panel. In Control Panel, select &lt;strong&gt;Programs&lt;/strong&gt;. In the next screen, select &lt;strong&gt;Programs and Features,&lt;/strong&gt; and from the list,&amp;nbsp;right-click Microsoft Office Outlook 2007, and click &lt;strong&gt;Change&lt;/strong&gt; as is shown below:&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a title="InstallOutlook2007PIAInitial" href="http://www.flickr.com/photos/99548241@N00/1451248616/"&gt;&lt;img alt="InstallOutlook2007PIAInitial" src="http://static.flickr.com/1408/1451248616_1c32a7c722.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the next dialog, click &lt;strong&gt;Add or Remove Features&lt;/strong&gt;, and click &lt;strong&gt;Continue&lt;/strong&gt;. 
&lt;li&gt;In the next screen, make sure that you select &lt;strong&gt;".NET Programmability Support&lt;/strong&gt;" as shown below:&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a title="Outlook2007PIA" href="http://www.flickr.com/photos/99548241@N00/1450418881/"&gt;&lt;img alt="Outlook2007PIA" src="http://static.flickr.com/1026/1450418881_26280a2c29.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Continue&lt;/strong&gt;. The Configuration Progress dialog will show the installation progress. 
&lt;li&gt;Click the &lt;strong&gt;Close&lt;/strong&gt; button in the &lt;strong&gt;Installation Completed&lt;/strong&gt; screen.&lt;/li&gt;&lt;/ul&gt;
&lt;h3&gt;Implementing our Cmdlet&lt;/h3&gt;
&lt;h4&gt;Creating the Cmdlet skeleton with the Visual Studio Template&lt;/h4&gt;
&lt;p&gt;To create the skeleton for your custom cmdlet, follow these steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start Visual Studio, and select &lt;strong&gt;File | New Project&lt;/strong&gt;. Select a location, and in the &lt;strong&gt;Project Types&lt;/strong&gt; tree, select&amp;nbsp;&lt;strong&gt;Windows PowerShell&lt;/strong&gt;. Pick a&amp;nbsp;name for your project, in my case I selected the name &lt;font face="Courier New" size="2"&gt;FooTheory.GetContactCmdlet&lt;/font&gt; as is shown below:&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a title="NewPowerShellCmdletProjectScreen" href="http://www.flickr.com/photos/99548241@N00/1464512950/"&gt;&lt;img alt="NewPowerShellCmdletProjectScreen" src="http://static.flickr.com/1370/1464512950_41b32ce54b.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;OK&lt;/strong&gt; to create the project. The template will create a class library with the appropriate references added, and a snap-in class, as shown in the screen shot below:&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a title="InitialCmdletProjectStructure" href="http://www.flickr.com/photos/99548241@N00/1463688199/"&gt;&lt;img alt="InitialCmdletProjectStructure" src="http://static.flickr.com/1263/1463688199_bc61dd8042.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;font face="Courier New" size="2"&gt;PSSnapin.cs&lt;/font&gt; file implements a &lt;strong&gt;PowerShell Snap-in&lt;/strong&gt;. Windows PowerShell snap-ins provide a mechanism for registering cmdlets and/or providers with the shell, thus extending the functionality of the shell. A Windows PowerShell snap-in can register all the cmdlets and providers in a single assembly, or it can register a specific list of cmdlets and providers. In our case, we will only have our one &lt;font face="Courier New" size="2"&gt;Get-Contact&lt;/font&gt; cmdlet in assembly, so we will only need to register that specific cmdlet.&lt;/p&gt;
&lt;p&gt;Since I called my assembly &lt;font face="Courier New" size="2"&gt;Footheory.GetContactCmdlet&lt;/font&gt;, the template named my snap-in class FooTheory.GetContactCmdletSnapIn, which is of course an invalid class name, so I changed it to just &lt;font face="Courier New" size="2"&gt;GetContactCmdletSnapIn,&lt;/font&gt; and I renamed its source file from &lt;font face="Courier New" size="2"&gt;PSSnapIn.cs&lt;/font&gt; to &lt;font face="Courier New" size="2"&gt;GetContactCmdletSnapIn.cs&lt;/font&gt;. The methods of the Snap-in provide information to the installer, such as the Name of the assembly, the Vendor etc. The wizard does a pretty good job of implementing these methods, so you only need to provide some tweaks, like filling in the name of the Vendor etc. The finalized version of my Snap-in class is shown below:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:616b342b-0430-47d4-b374-0d769f53ab5f" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E0E0E0;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Management.Automation;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.ComponentModel;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; FooTheory.GetContactCmdlet
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This is our Snap-In class implementation. This class is
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; used by the Installer, and by the Add-PSSnapIn command
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; when we register our cmdlet with the PowerShell runtime
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    [RunInstaller(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetContactCmdletSnapIn : PSSnapIn
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Name
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;FooTheory.GetContactCmdlet&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Vendor
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;www.FooTheory.com&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; VendorResource
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;FooTheory.GetContactCmdlet,&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Description
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Registers the CmdLets and Providers in this assembly&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;31&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; DescriptionResource
&lt;/span&gt;&lt;span style="color:#008080;"&gt;32&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;33&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;GetContactCmdlet,Registers the CmdLets and Providers in this assembly&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;34&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;35&lt;/span&gt; &lt;span style="color:#000000;"&gt;    } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; class GetContactCmdletSnapIn&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;36&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
&lt;/span&gt;&lt;span style="color:#008080;"&gt;37&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Notice also that the wizard added the following references to our project:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;System.Management.Automation&lt;/font&gt;. This is the main PowerShell SDK assembly 
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;System.Configuration.Install&lt;/font&gt;: Needed by the Snap-in for installation.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;(the other assemblies are the "standard" assemblies added to any project).&lt;/p&gt;
&lt;p&gt;At this point, I would recommend building your project to make sure that you have no compilation errors.&lt;/p&gt;
&lt;h4&gt;Adding our Cmdlet class&lt;/h4&gt;
&lt;p&gt;Now, we are ready to add our cmdlet class itself. Right-click the project and select &lt;strong&gt;Add | New Item&lt;/strong&gt;. In the New Item dialog, you will notice that you have a choice of deriving from two different types of base classes:&lt;/p&gt;
&lt;p&gt;&lt;a title="NewItemPowerShellTemplate" href="http://www.flickr.com/photos/99548241@N00/1464616584/"&gt;&lt;img alt="NewItemPowerShellTemplate" src="http://static.flickr.com/1149/1464616584_08aab08e36.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The first option (&lt;strong&gt;Windows PowerShell Cmdlet&lt;/strong&gt;), will derive our cmdlet from the &lt;font face="Courier New" size="2"&gt;System.Management.Automation.Cmdlet&lt;/font&gt; base class. Deriving from this class means that our cmdlet is using a minimum set of dependencies on the Windows PowerShell runtime. This has two benefits: 
&lt;ul&gt;
&lt;li&gt;The footprint of our cmdlet will be smaller and if there are any changes in the Windows PowerShell runtime, our cmdlet will very likely not be impacted. 
&lt;li&gt;It is also a lot easier to unit-test a cmdlet that is derived from the standard &lt;font face="Courier New" size="2"&gt;Cmdlet&lt;/font&gt; class, since we can directly create an instance of it and invoke it from our test code, without having to test it from the PowerShell command line.&lt;/li&gt;&lt;/ul&gt;
&lt;li&gt;The second option (&lt;strong&gt;Windows PowerShell PSCmdlet&lt;/strong&gt;) will derive our cmdlet from the &lt;font face="Courier New" size="2"&gt;System.Management.Automation.PSCmdlet&lt;/font&gt; class. If you derive from this class, you will have more direct access to the Windows PowerShell runtime environment. For example, from your cmdlet you can: 
&lt;ol&gt;
&lt;li&gt;Call scripts. 
&lt;li&gt;Access Providers 
&lt;li&gt;Access the current session state.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;But this will also increase the size of your cmdlet, and it will tie our cmdlet&amp;nbsp;more tightly to the current version of the PowerShell runtime.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In general, Microsoft recommends that you derive a custom cmdlet from the &lt;font face="Courier New" size="2"&gt;Cmdlet&lt;/font&gt; class, unless you absolutely have a need access to the PowerShell runtime. We have no such requirement, so we will derive our cmdlet from the &lt;font face="Courier New" size="2"&gt;System.Management.Automation.Cmdlet&lt;/font&gt; class. Select Windows PowerShell Cmdlet, and enter &lt;font face="Courier New" size="2"&gt;GetContactCmdlet.cs&lt;/font&gt; as the name for the source file, and click the &lt;strong&gt;Add&lt;/strong&gt; button. This will add the &lt;font face="Courier New" size="2"&gt;GetContactCmdlet&lt;/font&gt; class to our project. This class contains the initial skeleton code for our cmdlet, which we will be customizing in our next section.&lt;/p&gt;
&lt;h4&gt;Customizing&amp;nbsp;the Cmdlet Attributes&lt;/h4&gt;
&lt;p&gt;The default implementation of our cmdlet declares our class as follows:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:3eda420a-099b-4920-9f1f-e10020a198ad" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E4E4E4;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; FooTheory.GetContactCmdlet
{
    [Cmdlet(VerbsCommon.Get, &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;GetContactCmdlet&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, SupportsShouldProcess &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetContactCmdlet : Cmdlet
    {
      ...
    }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The &lt;font face="Courier New" size="2"&gt;CmdLetAttribute&lt;/font&gt; identifies a .NET class as a cmdlet and specifies the verb and noun pair used to invoke the cmdlet. The required parameters for this attribute include the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;VerbName. This is the name that describes the action performed by the cmdlet. Windows PowerShell strongly recommends that cmdlets use only the verb names specified by the action name enumerators (&lt;a href="http://msdn2.microsoft.com/en-us/library/ms714428.aspx" target="_blank"&gt;VerbsCommon&lt;/a&gt;). Note that in our case, we are using &lt;font face="Courier New" size="2"&gt;VerbCommons.Get&lt;/font&gt;, which indicates that we are retrieving information. 
&lt;li&gt;NounName. This string is the name that describes the entity on which the cmdlet performs its action. The wizard will set this to the class name of our cmdlet, which in this case is not what we want. Since we are retrieving contact, we will use the string "&lt;font face="Courier New" size="2"&gt;Contact&lt;/font&gt;" here.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;The optional &lt;font face="Courier New" size="2"&gt;SupportsShouldProcces&lt;/font&gt; named parameter indicates that our cmdlet supports calls to the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.management.automation.cmdlet.shouldprocess.aspx" target="_blank"&gt;ShouldProcess&lt;/a&gt; method, which provides the cmdlet with a way to prompt the user before an action that changes the system is performed. This is actually a very useful parameter, and I recommend that you support it in any of your cmdlets that you implement which modify the state of a system resource. It can avoid one of those "Oh Sh#$" situations that you could run into otherwise (&lt;em&gt;I did not mean to do that&lt;/em&gt;, &lt;em&gt;Oh my God, I'm fired &lt;/em&gt;&amp;nbsp;etc.. ). The &lt;font face="Courier New" size="2"&gt;ShouldProcess&lt;/font&gt; method is triggered by using the &lt;font face="Courier New" size="2"&gt;confirm&lt;/font&gt; switch parameter on a command, as is shown below for the&lt;font face="Courier New" size="2"&gt; Stop-Process&lt;/font&gt; cmdlet:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:4f06304b-97d6-4a3c-9712-4a60847374dd" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#B3B3FF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;13&lt;/span&gt;&lt;span style="color:#000000;"&gt;# Stop&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Process &lt;/span&gt;&lt;span style="color:#000000;"&gt;2920&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;confirm

Confirm
Are you sure you want to perform &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt; action&lt;/span&gt;&lt;span style="color:#000000;"&gt;?&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Performing operation &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Stop-Process&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; on Target &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;wmpnscfg (2920)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;.
&lt;img src="http://footheory.com/emoticons/emotion-21.gif" alt="Yes" /&gt; Yes  &lt;img src="http://footheory.com/emoticons/emotion-13.gif" alt="Angel" /&gt; Yes to All  &lt;img src="http://footheory.com/emoticons/emotion-45.gif" alt="No" /&gt; No  [L] No to All  &lt;img src="http://footheory.com/emoticons/emotion-56.gif" alt="Sleep" /&gt; Suspend  [&lt;/span&gt;&lt;span style="color:#000000;"&gt;?&lt;/span&gt;&lt;span style="color:#000000;"&gt;] Help (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;default&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;is&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Y&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;):
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Another very useful named parameter is &lt;font face="Courier New" size="2"&gt;ConfirmImpact&lt;/font&gt;. &lt;font face="Courier New" size="2"&gt;ConfirmImpact&lt;/font&gt; will trigger the cmdlet to show what action would be performed if the user would execute the command, without actually performing the action. It is triggered by the&amp;nbsp;&lt;font face="Courier New" size="2"&gt;WhatIf&lt;/font&gt; switch parameter, an example with the&amp;nbsp;&lt;font face="Courier New" size="2"&gt;Stop-Process&lt;/font&gt; cmdlet is shown below:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:84136c8d-d462-4603-9eee-61b8aaff7632" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#AEAEFF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;15&lt;/span&gt;&lt;span style="color:#000000;"&gt;# Stop&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Process &lt;/span&gt;&lt;span style="color:#000000;"&gt;2920&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;whatif
What &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt;: Performing operation &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Stop-Process&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; on Target &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;wmpnscfg (2920)&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;As you can see, the &lt;font face="Courier New" size="2"&gt;WhatIf&lt;/font&gt; switch parameter shows us the action(s) that would be trigger by&amp;nbsp;the execution of the command without actually executing it. I really recommend using this switch for any command that you just not 100% sure about ; -)..&lt;/p&gt;
&lt;p&gt;Back to the &lt;font face="Courier New" size="2"&gt;Get-Contact&lt;/font&gt; cmdlet now. In the &lt;font face="Courier New" size="2"&gt;Get-Contact&lt;/font&gt; cmdlet&amp;nbsp;case, we are only retrieving information, and we are not changing anything in the state of the system, so we can safely set the value of the &lt;font face="Courier New" size="2"&gt;ShouldProcess&lt;/font&gt; member to &lt;font face="Courier New" size="2"&gt;false&lt;/font&gt;.&lt;/p&gt;
&lt;p&gt;Our final class declaration for our cmdlet&amp;nbsp;will look as follows:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:282f72b1-fd99-44d6-b9eb-0f021c3df111" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E6E6E6;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; FooTheory.GetContactCmdlet
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt;3&lt;/span&gt; &lt;span style="color:#000000;"&gt;    [Cmdlet(VerbsCommon.Get, &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Contact&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, SupportsShouldProcess &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
&lt;/span&gt;&lt;span style="color:#008080;"&gt;4&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetContactCmdlet : Cmdlet
&lt;/span&gt;&lt;span style="color:#008080;"&gt;5&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        ....
&lt;/span&gt;&lt;span style="color:#008080;"&gt;7&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;8&lt;/span&gt; &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h4&gt;Implementing a Record Processing Methodology&lt;/h4&gt;
&lt;p&gt;For a cmdlet to participate in the Windows PowerShell environment, it &lt;strong&gt;must&lt;/strong&gt; override the &lt;font face="Courier New" size="2"&gt;ProcessRecord()&lt;/font&gt; method listed below, and optionally the &lt;font face="Courier New" size="2"&gt;BeginProcessing()&lt;/font&gt; and &lt;font face="Courier New" size="2"&gt;EndProcessing()&lt;/font&gt; methods. The semantics of these methods are shown below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/system.management.automation.cmdlet.beginprocessing.aspx" target="_blank"&gt;System.Management.Automation.Cmdlet.BeginProcessing&lt;/a&gt;: This method is called once for each command pipeline, before the first record is processed. You can use this method to provide pre-processing functionality, allocated unmanaged resources etc. 
&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/system.management.automation.cmdlet.processrecord.aspx" target="_blank"&gt;System.Management.Automation.Cmdlet.ProcessRecord&lt;/a&gt;: This method is called multiple times, and is used to provide record-by-record functionality. This is where we will call into the main execution logic. 
&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/system.management.automation.cmdlet.endprocessing.aspx" target="_blank"&gt;System.Management.Automation.Cmdlet.EndProcessing&lt;/a&gt;: This method is called one, and is used to provide post-processing functionality, for example to free up unmanaged resources.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;We will leverage these methods as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In &lt;font face="Courier New" size="2"&gt;BeginProcessing&lt;/font&gt;, we will setup the connection with Outlook, creating the main Outlook &lt;font face="Courier New" size="2"&gt;Application&lt;/font&gt; class. 
&lt;li&gt;In &lt;font face="Courier New" size="2"&gt;ProcessRecord&lt;/font&gt;, we will retrieve the Outlook&amp;nbsp; 2007 contacts, based upon the specified parameters, as defined in our list of requirements. 
&lt;li&gt;In &lt;font face="Courier New" size="2"&gt;EndProcessing&lt;/font&gt;, we will disconnect from Outlook 2007, freeing up any tied-up COM objects from the Outlook PIA.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;I don't like to mix the "core" cmdlet code and the Outlook code, so in my project structure I created an &lt;strong&gt;Implementation &lt;/strong&gt;folder, and added a &lt;font face="Courier New" size="2"&gt;GetContactsImpl.cs&lt;/font&gt; class, which will contain our "real" implementation, the interactions with the COM objects etc. This class is marked as internal, and contains three methods to correspond with the main cmdlet processing methods:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;SetupOutlookConnection()&lt;/font&gt;: This method is called from our cmdlet's &lt;font face="Courier New" size="2"&gt;BeginProcessing&lt;/font&gt; method, and will initialize the connection to Outlook. 
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;GetContacts()&lt;/font&gt;: This method retrieves the actual contacts from outlook, and is&amp;nbsp;called&amp;nbsp;from the cmdlet's &lt;font face="Courier New" size="2"&gt;ProcessRecord&lt;/font&gt; method.&amp;nbsp; 
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;TeardownOutlookConnection()&lt;/font&gt;: This method is called from the cmdlet's &lt;font face="Courier New"&gt;EndProcessing&lt;/font&gt; method, and cleans up out Outlook application object, and any other tied-up COM objects.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;The following class diagram shows the relationship between our cmdlet and it's implementation class:&lt;/p&gt;
&lt;p&gt;&lt;a title="Overview" href="http://www.flickr.com/photos/99548241@N00/1465091130/"&gt;&lt;img alt="Overview" src="http://static.flickr.com/1118/1465091130_9a70c31587.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Creating a Unit Testing Framework for our Cmdlet&lt;/h4&gt;
&lt;p&gt;Now that we have the skeleton of our cmdlet all setup, it would be a good idea to create a unit test project for it. That way, we can quickly test the functionality of the cmdlet right in Visual Studio&amp;nbsp;without having to go the PowerShell console to perform the testing.&lt;/p&gt;
&lt;p&gt;To add the Unit Test project, follow these steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Right-click the solution, and click &lt;strong&gt;Add | New Project&lt;/strong&gt;. 
&lt;li&gt;Under the &lt;strong&gt;Visual C#&lt;/strong&gt; tree branch, select &lt;strong&gt;Test&lt;/strong&gt;, and in the list of templates click &lt;strong&gt;Test Project&lt;/strong&gt;. Name the project &lt;font face="Courier New" size="2"&gt;FooTheory.GetContactCmdLet.Test&lt;/font&gt;, as is shown below:&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a title="TestProjectForCmdLet" href="http://www.flickr.com/photos/99548241@N00/1471211582/"&gt;&lt;img alt="TestProjectForCmdLet" src="http://static.flickr.com/1329/1471211582_e5f5ba44d4.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;OK&lt;/strong&gt; to create the test project. 
&lt;li&gt;From the generated project files, delete the manual test (&lt;font face="Courier New" size="2"&gt;ManualTest1.mht&lt;/font&gt;), and the generated unit test (&lt;font face="Courier New" size="2"&gt;UnitTest1.cs&lt;/font&gt;). 
&lt;li&gt;Right-click the project and select&lt;strong&gt;&amp;nbsp;Add | Unit Test&lt;/strong&gt;. 
&lt;li&gt;In the &lt;strong&gt;Create Unit Test &lt;/strong&gt;dialog, expand the tree until you get to the cmdlet, and select all of the members below the cmdlet (which are our three main methods: BeginProcessing, ProcessRecord and EndProcessing), as show below:&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a title="CreateUnitTestForCmdLet" href="http://www.flickr.com/photos/99548241@N00/1471239722/"&gt;&lt;img alt="CreateUnitTestForCmdLet" src="http://static.flickr.com/1439/1471239722_ecbd96b7a8.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Click &lt;strong&gt;OK&lt;/strong&gt; to create the unit test file. Visual Studio will create a skeleton unit test with a test method for each of your selected methods. By&amp;nbsp; default, the results of our tests will be set to "inconclusive" by default. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To start out with, I cleaned up the generated the test code a bit, and created one test method which calls into all methods in sequence. The full code for the initial test is shown below:&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:0a9a2e66-c725-4ffe-ab8b-f9ba922b91f6" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#DDDDDD;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; The following code was generated by Microsoft Visual Studio 2005.
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; The test owner should check each test for validity.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; Microsoft.VisualStudio.TestTools.UnitTesting;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Text;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Collections.Generic;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; FooTheory.GetContactCmdlet;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; CmdLet &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; FooTheory.GetContactCmdlet.GetContactCmdlet;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; FooTheory.GetContactCmdLet.Test
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt;This is a test class for FooTheory.GetContactCmdlet.GetContactCmdlet and is intended
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt;to contain all FooTheory.GetContactCmdlet.GetContactCmdlet Unit Tests
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    [TestClass()]
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetContactCmdletTest
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; TestContext testContextInstance;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt;Gets or sets the test context which provides
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt;information about and functionality for the current test run.
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; TestContext TestContext
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; testContextInstance;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;31&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;32&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;33&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;34&lt;/span&gt; &lt;span style="color:#000000;"&gt;                testContextInstance &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;35&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;36&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;37&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;38&lt;/span&gt; &lt;span style="color:#000000;"&gt;        [DeploymentItem(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;FooTheory.GetContactCmdlet.dll&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
&lt;/span&gt;&lt;span style="color:#008080;"&gt;39&lt;/span&gt; &lt;span style="color:#000000;"&gt;        [TestMethod()]
&lt;/span&gt;&lt;span style="color:#008080;"&gt;40&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; CompleteTest()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;41&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;42&lt;/span&gt; &lt;span style="color:#000000;"&gt;            CmdLet target &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; CmdLet();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;43&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;44&lt;/span&gt; &lt;span style="color:#000000;"&gt;            FooTheory.GetContactCmdLet.Test.FooTheory_GetContactCmdlet_GetContactCmdletAccessor accessor &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;45&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; FooTheory.GetContactCmdLet.Test.FooTheory_GetContactCmdlet_GetContactCmdletAccessor(target);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;46&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;47&lt;/span&gt; &lt;span style="color:#000000;"&gt;            accessor.BeginProcessing();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;48&lt;/span&gt; &lt;span style="color:#000000;"&gt;            accessor.ProcessRecord();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;49&lt;/span&gt; &lt;span style="color:#000000;"&gt;            accessor.EndProcessing();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;50&lt;/span&gt; &lt;span style="color:#000000;"&gt;        
&lt;/span&gt;&lt;span style="color:#008080;"&gt;51&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method CompleteTest&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;52&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;53&lt;/span&gt; &lt;span style="color:#000000;"&gt;    } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; class GetContactCmdletTest&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;54&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Do a full debug run on the test project to ensure that everything is working fine (it should be, because we are not doing anything yet.. ;-).&amp;nbsp;So, now we are all set, we have our skeleton&amp;nbsp; cmdlet code, we have a unit test, we are ready to start implementing this puppy!&lt;/p&gt;
&lt;h4&gt;Finally, some "real" Coding: Creating the initial version of our Cmdlet&lt;/h4&gt;
&lt;p&gt;First, we need a add a reference to the Outlook 2007 PIA to our cmdlet project. Add a reference to the Microsoft Outlook 12.0 Object Library, and is shown below:&lt;/p&gt;
&lt;p&gt;&lt;a title="ReferenceToOutlook2007PIA" href="http://www.flickr.com/photos/99548241@N00/1470461999/"&gt;&lt;img alt="ReferenceToOutlook2007PIA" src="http://static.flickr.com/1260/1470461999_19020e7761.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Click &lt;strong&gt;OK&lt;/strong&gt; to add the reference.&amp;nbsp;Include a using statement for &lt;font face="Courier New"&gt;Microsoft.Office.Interop.Outlook&lt;/font&gt; and add an an explicit using statement to the cmdlet implementation class source file, as shown below:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:01f619e9-1e92-4b7b-bfbb-541c9ba98f2f" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#D4D4D4;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; Microsoft.Office.Interop.Outlook;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; Outlook &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; Microsoft.Office.Interop.Outlook;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, we&amp;nbsp;can create an instance of the main Outlook Application class in our &lt;font face="Courier New" size="2"&gt;SetupOutlookConnection()&lt;/font&gt; method, and release it&amp;nbsp;in the &lt;font face="Courier New" size="2"&gt;TeardownOutlookConnection()&lt;/font&gt; method. Our implementation class code so far is shown below:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:4a6095b7-1cc0-4a79-a93b-f57fbe1ef928" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E8E8E8;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Collections.Generic;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Runtime.InteropServices;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; Outlook &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; Microsoft.Office.Interop.Outlook;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; FooTheory.GetContactCmdlet.Implementation
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This class is our implementation class for the Get-Contact 
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; cmdlet.
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;internal&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetContactsImpl
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;#region&lt;/span&gt;&lt;span style="color:#000000;"&gt; private fields&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; This is our Outlook application class&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; Outlook.ApplicationClass m_Application;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;#endregion&lt;/span&gt;&lt;span style="color:#000000;"&gt; private fields&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;internal&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; SetupOutlookConnection()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Create an instance of our Application class&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            m_Application &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Microsoft.Office.Interop.Outlook.ApplicationClass();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;internal&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetContacts()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;internal&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; TeardownOutlookConnection()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;31&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;32&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Release our COM object&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;33&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            Marshal.ReleaseComObject(m_Application);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;34&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;35&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;36&lt;/span&gt; &lt;span style="color:#000000;"&gt;    } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; class GetContactsImpl&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;37&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;38&lt;/span&gt; &lt;span style="color:#000000;"&gt;} &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; namespace FooTheory.GetContactCmdlet.Implementation&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Note have we use &lt;font face="Courier New" size="2"&gt;Marshal.ReleaseComObject&lt;/font&gt; to release the &lt;font face="Courier New" size="2"&gt;m_application&lt;/font&gt; COM object instance, since we are dealing with COM interop here,&amp;nbsp;because we are invoking the methods in the PIA through a RCW (Runtime Callable Wrapper).&lt;/p&gt;
&lt;p&gt;At this point, it would be a good idea to run the unit test again to make sure everything is running OK.&lt;/p&gt;
&lt;p&gt;Next, we will implement a "bare minimum" version of the &lt;font face="Courier New" size="2"&gt;GetContacts&lt;/font&gt; method. The code is shown below:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:2e49f702-7320-4766-a84e-e2c16f46f885" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#DBDBDB;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This method returns our list of Contacts
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;internal&lt;/span&gt;&lt;span style="color:#000000;"&gt; List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ContactItem&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetContacts()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Get the contacts folders&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            MAPIFolder contactsFolder &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;                m_Application.Session.GetDefaultFolder(OlDefaultFolders.olFolderContacts);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Create our output list of ContactItems and add the ContactItems&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ContactItem&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; contacts &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ContactItem&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt;(ContactItem contactItem &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; contactsFolder.Items)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;                contacts.Add(contactItem);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; contacts;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;In lines 8 and 9 we are getting a reference to the Contacts Folder, and then (line 13-15)&amp;nbsp;we loop&amp;nbsp;through each&amp;nbsp;&lt;font face="Courier New" size="2"&gt;ContactItem&lt;/font&gt; and add it to our strongly-typed&amp;nbsp;List.&amp;nbsp;&amp;nbsp;Again, at this point I would recommend a quick unit test to make sure that your code is running fine. &lt;/p&gt;
&lt;p&gt;Now, we are ready to change the main body of our cmdlet to output the list of &lt;font face="Courier New" size="2"&gt;ContactItems&lt;/font&gt;. To write a single&amp;nbsp;object to the pipeline, the PowerShell SDK provides a &lt;a href="http://msdn2.microsoft.com/en-us/library/ms568371.aspx" target="_blank"&gt;System.Management.Automation.Cmdlet.WriteObject&lt;/a&gt; method. We use this method to write the &lt;font face="Courier New" size="2"&gt;List&amp;lt;ContactItem&amp;gt;&lt;/font&gt; instance to the pipeline. The first&amp;nbsp; argument to the method is our&amp;nbsp;&lt;font face="Courier New" size="2"&gt;List&amp;lt;ContactItem&amp;gt;&lt;/font&gt; object, and the second parameter is set to &lt;font face="Courier New" size="2"&gt;true&lt;/font&gt; to indicate the our object is a collection, and that PowerShell should enumerate over the collection and send each object in turn through the pipeline.&lt;/p&gt;
&lt;p&gt;We need to make sure that we add the following using statement to our main cmdlet code file:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:89a06b5e-5f2d-4ce1-b517-9de3bcfd1e1b" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#DBDBDB;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; Microsoft.Office.Interop.Outlook;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The implementation our our &lt;font face="Courier New" size="2"&gt;ProcessRecord()&lt;/font&gt; method is now very simple:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:be80a30e-1c53-4a66-b230-e25ff717c2de" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E0E0E0;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This is our main processing method
&lt;/span&gt;&lt;span style="color:#008080;"&gt;3&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;4&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ProcessRecord()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;5&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;6&lt;/span&gt; &lt;span style="color:#000000;"&gt;            List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ContactItem&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; contacts &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; m_implementation.GetContacts();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;7&lt;/span&gt; &lt;span style="color:#000000;"&gt;            WriteObject(contacts, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;8&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;9&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;So, we simply call into our implementation to get the list of &lt;font face="Courier New" size="2"&gt;ContactItem&lt;/font&gt;'s, and the we use &lt;font face="Courier New" size="2"&gt;WriteObject()&lt;/font&gt; to write this instance to the pipeline. The PowerShell runtime will enumerate through each member of our collection, and stream each object through the command pipline in turn.&lt;/p&gt;
&lt;p&gt;One important thing that I noticed when I unit tested this first, is that I would get a &lt;font face="Courier New" size="2"&gt;NotImplementedException&lt;/font&gt; on the &lt;font face="Courier New" size="2"&gt;WriteObject&lt;/font&gt; statement, while I would NOT get this error during testing in the PowerShell console. This is probably because the unit test environment is not a "real" cmdlet host environment. Therefore, I surrounded the &lt;font face="Courier New" size="2"&gt;WriteObject&lt;/font&gt; with a try/catch block during my testing period as follows:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:1570b724-7a92-4ad4-93ea-ac79c77a1d21" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E1E1E1;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ProcessRecord()
        {
            List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ContactItem&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; contacts &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; m_implementation.GetContacts();
            
            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;  We get a NotImplemented exception during testing,
            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;  hence the try/catch. I recommend that you remove the 
            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;  try/catch after testing is complete!
            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//
&lt;/span&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;try&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            {
                WriteObject(contacts, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
            }
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;catch&lt;/span&gt;&lt;span style="color:#000000;"&gt; (NotImplementedException)
            {
            }
        } &lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This should complete our initial, simple version of the cmdlet. Time to bring out the PowerShell console to do some "real" testing!&lt;/p&gt;
&lt;h3&gt;Testing our initial Cmdlet version in the PowerShell Console&lt;/h3&gt;
&lt;h4&gt;Installing the Cmdlet&lt;/h4&gt;
&lt;p&gt;Before we can test our cmdlet, we first need to install the assembly which contains our cmdlet, and use the &lt;font face="Courier New" size="2"&gt;Add-PSSnapIn&lt;/font&gt; cmdlet to add the snap-in to our PowerShell console. And of course, since we are using PowerShell here, what other tools should we use to do this task? In the &lt;font face="Courier New" size="2"&gt;Installation&lt;/font&gt; sub-folder I have two scripts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;InstallCmdlet.ps1&lt;/strong&gt;&lt;/font&gt;. This script installs our assembly, and adds the snap-in to the console. 
&lt;li&gt;&lt;strong&gt;&lt;font face="Courier New" size="2"&gt;UninstallCmdlet.ps1&lt;/font&gt;&lt;/strong&gt;: This script removes the snap-in and performs an uninstall of our assembly.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;The contents of &lt;font face="Courier New" size="2"&gt;InstallCmdlet.ps1&lt;/font&gt; is shown below:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:ba69ca2c-6a19-4d2d-9749-dda848d416e7" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E9E9E9;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;installutil ..&lt;/span&gt;&lt;span style="color:#000000;"&gt;\&lt;/span&gt;&lt;span style="color:#000000;"&gt;bin&lt;/span&gt;&lt;span style="color:#000000;"&gt;\&lt;/span&gt;&lt;span style="color:#000000;"&gt;debug&lt;/span&gt;&lt;span style="color:#000000;"&gt;\&lt;/span&gt;&lt;span style="color:#000000;"&gt;FooTheory.GetContactCmdlet.dll
Add&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;PSSnapIn FooTheory.GetContactCmdlet&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;To register the cmdlet, follow these steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open a PowerShell prompt, and navigate to the &lt;font face="Courier New" size="2"&gt;Installation&lt;/font&gt; sub-directory of your project. 
&lt;li&gt;Run&amp;nbsp; the &lt;font face="Courier New" size="2"&gt;InstallcmdLet.ps1&lt;/font&gt; script, as is shown below:&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a title="InstallCmdlet" href="http://www.flickr.com/photos/99548241@N00/1471509892/"&gt;&lt;img alt="InstallCmdlet" src="http://static.flickr.com/1235/1471509892_ed0a9ab896.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Our cmdlet is now registered and ready to go. Note that you will have to run the registration script each time you start up a new PowerShell console, and you want to use the &lt;font face="Courier New" size="2"&gt;Get-Contact&lt;/font&gt; cmdlet. You will notice that you get tired of this real quick, so I recommend that&amp;nbsp; you run the installation script from your user profile script, which is typically located at:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;C:\Users\&amp;lt;UserName&amp;gt;\Documents\WindowsPowerShell\profile.ps1&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;(Substitute &amp;lt;UserName&amp;gt; with your user name). For example, this is the code I added to the end of my profile.ps1 file:&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:fa0fd346-7bfc-4d68-90fc-1ee8783e3fab" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#9393FF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;# Register our Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Contact cmdlet
Push&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Location &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;c:\bhaelen\Posts\Custom cmdlets for PowerShell\Code\FooTheory.GetContactCmdlet\Installation&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
.\InstallCmdlet.ps1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; $&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Pop&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Location&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Notice also how I redirect the output of the install to $null, so we don't get the full output of the install and registration command each time we startup the PowerShell console.&lt;/p&gt;
&lt;p&gt;Before we can start testing, we should first make sure that our Outlook 2007 instance is configured correctly.&lt;/p&gt;
&lt;h4&gt;Configuring Outlook&lt;/h4&gt;
&lt;p&gt;You can configure Outlook to allow or disallow programmatic access by selecting &lt;strong&gt;Tools&lt;/strong&gt; | &lt;strong&gt;Marco&lt;/strong&gt; | &lt;strong&gt;Security&lt;/strong&gt;. In the &lt;strong&gt;Trust Center&lt;/strong&gt; dialog, select &lt;strong&gt;Programmatic Access&lt;/strong&gt;, as is shown in the screen shot below:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a title="Outlook2007TrustCenter" href="http://www.flickr.com/photos/99548241@N00/1506967769/"&gt;&lt;img alt="Outlook2007TrustCenter" src="http://static.flickr.com/2162/1506967769_5df6569dcb.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The default option is the second option (&lt;em&gt;always warn me about suspicious activity&lt;/em&gt;). You can leave Outlook at this setting, but then you will get&amp;nbsp;a prompt each time you run the &lt;font face="Courier New" size="2"&gt;Get-Contact&lt;/font&gt; cmdlet. The recommended setting is the first option (&lt;em&gt;Warn me about suspicious activity when my antivirus software is inactive or out of date&lt;/em&gt;) so I recommend that you use this setting while you are testing the &lt;font face="Courier New" size="2"&gt;Get-Contact&lt;/font&gt; cmdlet.&lt;/p&gt;
&lt;h4&gt;Testing our cmdlet&lt;/h4&gt;
&lt;p&gt;To find out what kind of information&amp;nbsp;you can get out of our &lt;font face="Courier New" size="2"&gt;Get-Contact&lt;/font&gt; cmdlet, run the following command in the PowerShell console:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:e43f376e-0a32-4814-91d2-c2eea3ea4b4a" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#B7B7FF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Contact &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Member &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;MemberType property&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;When you run this command, you will notice that you get a (very) long list of properties, a very small sub-set of which is shown below:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:aa732293-911f-4b53-9be7-edc674aa778c" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#B7B7FF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;   TypeName: System.__ComObject#{&lt;/span&gt;&lt;span style="color:#000000;"&gt;00063021&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;0000&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;0000&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;c000&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;000000000046&lt;/span&gt;&lt;span style="color:#000000;"&gt;}

Name                         MemberType Definition
&lt;/span&gt;&lt;span style="color:#000000;"&gt;----&lt;/span&gt;&lt;span style="color:#000000;"&gt;                         &lt;/span&gt;&lt;span style="color:#000000;"&gt;----------&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;----------&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Account                      Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Account () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
Actions                      Property   Actions Actions () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
Anniversary                  Property   Date Anniversary () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
Application                  Property   _Application Application () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
AssistantName                Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; AssistantName () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
AssistantTelephoneNumber     Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; AssistantTelephoneNumber () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
Attachments                  Property   Attachments Attachments () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
AutoResolvedWinner           Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt; AutoResolvedWinner () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
BillingInformation           Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; BillingInformation () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
Birthday                     Property   Date Birthday () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
Body                         Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Body () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
Business2TelephoneNumber     Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Business2TelephoneNumber () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
BusinessAddress              Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; BusinessAddress () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
BusinessAddressCity          Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; BusinessAddressCity () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
BusinessAddressCountry       Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; BusinessAddressCountry () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
BusinessAddressPostalCode    Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; BusinessAddressPostalCode () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
BusinessAddressPostOfficeBox Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; BusinessAddressPostOfficeBox () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
BusinessAddressState         Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; BusinessAddressState () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
BusinessAddressStreet        Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; BusinessAddressStreet () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
BusinessCardLayoutXml        Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; BusinessCardLayoutXml () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
BusinessCardType             Property   OlBusinessCardType BusinessCardType () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
BusinessFaxNumber            Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; BusinessFaxNumber () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
BusinessHomePage             Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; BusinessHomePage () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
BusinessTelephoneNumber      Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; BusinessTelephoneNumber () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
CallbackTelephoneNumber      Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; CallbackTelephoneNumber () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
CarTelephoneNumber           Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; CarTelephoneNumber () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
Categories                   Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Categories () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
Children                     Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Children () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
Class                        Property   OlObjectClass Class () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
Companies                    Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Companies () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
CompanyAndFullName           Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; CompanyAndFullName () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
CompanyLastFirstNoSpace      Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; CompanyLastFirstNoSpace () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
CompanyLastFirstSpaceOnly    Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; CompanyLastFirstSpaceOnly () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
CompanyMainTelephoneNumber   Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; CompanyMainTelephoneNumber () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
CompanyName                  Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; CompanyName () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
ComputerNetworkName          Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; ComputerNetworkName () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
Conflicts                    Property   Conflicts Conflicts () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
ConversationIndex            Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; ConversationIndex () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
ConversationTopic            Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; ConversationTopic () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
CreationTime                 Property   Date CreationTime () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
CustomerID                   Property   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; CustomerID () {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;} {&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;For example, if you want to retrieve the full name and the first email address of your contacts, you can run the following command in the console:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:e8069d66-8318-45cb-934e-132d5eaf6380" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#C4C4FF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Contact &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; Format&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Table &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Property FullName, Email1Address &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Autosize&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;This produces a nicely formatted table which looks something like this:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:408f56f1-06c2-4f80-80aa-83827c0f273c" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#C6C6FF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;FullName        Email1Address
&lt;/span&gt;&lt;span style="color:#000000;"&gt;--------&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#000000;"&gt;-------------&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Matthew Ortiz   &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;mortiz
Kyle Sanford    ksanford@statera.com
Noah Dipasquale &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;STATORG&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;FIRST ADMINISTRATIVE GROUP&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;RECIPIENTS&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;NDIPASQUALE
Wayne Macdonald &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;wmacdonald
Bob Mills       Bob_Mills@isagenix.net
Jeremy Campbell &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;jcampbell
Pete Miller     &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;pmiller
Aendenne Armour &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;aarmour
Jon Robinson    jRobinson@statera.com
Erl Egestad     &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;eegestad
Julie Clint     &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;jclint
Eric Boocock    &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;eboocock
Sayward Flint   &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;sflint
Malcolm Boswell &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;STATORG&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;FIRST ADMINISTRATIVE GROUP&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;RECIPIENTS&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;MBOSWELL
Mike Citro      &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;mcitro
Carol Jenner    &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;cjenner
Ray Kwan        &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;rkwan
Brian Hensel    &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;bhensel
Chris Banker    &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;cbanker
Chad Kingsley   &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;ckingsley
Tony Blodgett   &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;tblodgett
Donn Felker     &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;dfelker
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;So, our custom cmdlet is working nicely, we can integrate it in the pipeline, it nicely cleans up after itself, so now we can go ahead and implement our more advanced features, starting with supporting arguments and parameters.&lt;/p&gt;
&lt;h4&gt;Adding Support for Arguments and Parameters&lt;/h4&gt;
&lt;h5&gt;PowerShell command structure&lt;/h5&gt;
&lt;p&gt;In PowerShell, a basic command looks as follows:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;command -parameter1 -parameter2 argument1, argument2&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;Command&lt;/font&gt;: This is the name of the command. A command can be one of the following: 
&lt;ul&gt;
&lt;li&gt;A cmdlet (like our &lt;font face="Courier New" size="2"&gt;Get-Contact&lt;/font&gt;) 
&lt;li&gt;A shell function 
&lt;li&gt;A script command 
&lt;li&gt;A native Windows command (for example: &lt;font face="Courier New" size="2"&gt;Notepad, Calc&lt;/font&gt;, etc.)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;A command can be followed by zero or more parameters.&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;parameter1.&lt;/font&gt; This is a parameter that takes no arguments, often called a &lt;em&gt;switch parameter&lt;/em&gt;. 
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;parameter2.&lt;/font&gt; This is a parameter that takes two arguments 
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;argument1.&lt;/font&gt; First argument to &lt;font face="Courier New" size="2"&gt;parameter2&lt;/font&gt; 
&lt;li&gt;&lt;font face="Courier New"&gt;argument2.&lt;/font&gt; Second argument to &lt;font face="Courier New" size="2"&gt;parameter2&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h5&gt;Adding Parameter support to Get-Contact&lt;/h5&gt;
&lt;p&gt;As we mentioned in our requirements, we would like to enable our cmdlet to filter the returned list of contacts by the Last Name of the Contact. The user should be able to specify one or more names, and furthermore, should be able to use wildcards and regular expressions to specify the last name he/she is looking for (for example: give me all contacts which have a last name starting with A, B or C.).&lt;/p&gt;
&lt;p&gt;To support this functionality, we will add a &lt;font face="Courier New" size="2"&gt;LastName&lt;/font&gt;&amp;nbsp;property to our &lt;font face="Courier New" size="2"&gt;GetContactCmdlet&lt;/font&gt; class.&amp;nbsp;The full declaration of this property is shown below:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:4dab5d03-7388-418c-9462-b719e3032e88" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E0E0E0;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This is  our &amp;quot;LastName&amp;quot; parameter. This is a positional 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; parameter, which accepts an array of values, and supports
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; wildcard expansion. This parameter can also accept input
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; from the pipeline, and has a &amp;quot;ln&amp;quot; shorthand alias
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        [Parameter(
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Position &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Mandatory &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            ValueFromPipeline&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;            ValueFromPipelineByPropertyName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;            HelpMessage &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;This are the Last Names of the Contact. You can use wildcards&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;        [ValidateNotNullOrEmpty]
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;        [Alias(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ln&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)]
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] LastName
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; m_lastNames; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; { m_lastNames &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The type of our &lt;font face="Courier New" size="2"&gt;LastName&lt;/font&gt; property is &lt;font face="Courier New" size="2"&gt;string[]&lt;/font&gt;, because we want to allow the user to specify a list of last of last names, hence the declaration as an array. We backed this property with the &lt;font face="Courier New" size="2"&gt;m_lastNames&lt;/font&gt; private field. We adorned our property with a &lt;font face="Courier New" size="2"&gt;System.Management.Automation.ParameterAttribute&lt;/font&gt;, which identifies our property as a parameter of the &lt;font face="Courier New" size="2"&gt;Get-Contact&lt;/font&gt; cmdlet. The name of the parameter is the name of our property ("LastName").&lt;/p&gt;
&lt;p&gt;In our cmdlet class, we will pass the &lt;font face="Courier New" size="2"&gt;m_lastNames&lt;/font&gt; array to the &lt;font face="Courier New" size="2"&gt;GetContacts()&lt;/font&gt; method of our implementation class, as is shown below:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:5e5bede6-1c8e-4c6e-a16f-cd3292a66d10" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#DADADA;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This is our main processing method, called
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; once for each input record in the pipeline
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ProcessRecord()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;  Invoke our implementation method, passing in our array of last 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;  names&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ContactItem&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; contacts &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; m_implementation.GetContacts(m_lastNames);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;  We get a NotImplemented exception during testing,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;  hence the try/catch. I recommend that you remove the 
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;  try/catch after testing is complete!
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;try&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;                WriteObject(contacts, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;catch&lt;/span&gt;&lt;span style="color:#000000;"&gt; (NotImplementedException)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method ProcessRecord&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Our ParameterAttribute contains the following members:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;font face="Courier New" size="2"&gt;Postion.&lt;/font&gt;&lt;/strong&gt; This member identifies the &lt;font face="Courier New" size="2"&gt;LastName&lt;/font&gt; parameter as a positional parameter with position 0. This means that the first argument the user enters on the command line will be automatically inserted for the parameter. This implies that the user can omit the name of the parameter itself, so the following commands will be semantically identical:&lt;/li&gt;&lt;/ul&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:c4d780e7-7967-4627-a0a9-e7fe091d9aad" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#BBBBFF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;             Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Command &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;LastName Hensel, Banker     
             Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Contact Hensel, Banker     &lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;Mandatory.&lt;/strong&gt;&lt;/font&gt; This member indicates whether or not the parameters is required when invoking the cmdlet. Clearly, in our case the parameter is optional. 
&lt;li&gt;&lt;strong&gt;&lt;font face="Courier New" size="2"&gt;ValueFromPipeline&lt;/font&gt;&lt;/strong&gt;. This member indicates whether our cmdlet parameter can take values from incoming pipeline objects. For example, if you have a file &lt;font face="Courier New" size="2"&gt;Names.txt&lt;/font&gt;, containing a list of &lt;font face="Courier New" size="2"&gt;LastNames&lt;/font&gt;, you could use the content of this file as the&amp;nbsp;left-hand side&amp;nbsp;of a pipeline as follows:&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f2819943-cee3-49f6-b4c4-587e7f042c1a" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#B9B9FF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;14&lt;/span&gt;&lt;span style="color:#000000;"&gt;# Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Content Names.txt &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Contact &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; Format&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Table FullName, Email1Address &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;AutoSize     

    FullName        Email1Address
    &lt;/span&gt;&lt;span style="color:#000000;"&gt;--------&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#000000;"&gt;-------------&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    Chris Banker    &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;cbanker
    Brian Hensel    &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;bhensel
    Aendenne Armour &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;aarmour&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The content of the &lt;font face="Courier New" size="2"&gt;Names.txt&lt;/font&gt; file is shown below:&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:c900bb23-6d5e-440c-8f59-23803e56bb23" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#A8A8FF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;17&lt;/span&gt;&lt;span style="color:#000000;"&gt;# Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Content Names.txt
    Banker
    Hensel
    Armour
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Being able to process input from the pipeline opens up all kinds of possibilities for our cmdlet, since it now will be able to fully participate in the PowerShell pipeline processing mechanisms. I would definitely recommend always supporting this feature, since it does require no parsing&amp;nbsp;work except for the adding the &lt;font face="Courier New" size="2"&gt;ValueFromPipeline&lt;/font&gt; member to the &amp;nbsp;&lt;font face="Courier New" size="2"&gt;[Parameter]&lt;/font&gt; declaration!&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;ValueFromPipelineByPropertyName. If this property is set to true, the Windows PowerShell runtime will check incoming pipeline properties for a LastName property. If the incoming object has such a property, the runtime will bind the &lt;font face="Courier New" size="2"&gt;FullName&lt;/font&gt; parameter to the &lt;font face="Courier New" size="2"&gt;FullName&lt;/font&gt; property of the incoming object.&lt;/li&gt;&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;The sample code contains a class library assembly called FooTheory.SampleInputPipelineLib. This class library contains a simple class called Customer, which has a LastName property, and has a simple constructor that takes a lastName argument:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:2b7f02ed-a300-44b3-a306-2b2ac615c1d2" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E1E1E1;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Customer
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;  m_lastName;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;  LastName
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; m_lastName; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; { m_lastName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Customer(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; lastName)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;            m_lastName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; lastName;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;In the following PowerShell script we load this assembly, create an array of two customer objects, and use this array as the left-hand argument of a &lt;font face="Courier New" size="2"&gt;Get-Contact&lt;/font&gt; pipeline:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:57cb7f32-e525-468c-a384-d49d1c843f7e" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#BFBFFF;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;[System.Reflection.Assembly]::LoadFile($(Resolve&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Path .).Path &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\FooTheory.SampleInputPipelineLib.dll&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; $&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#000000;"&gt;$myCustomer &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; @($(New&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Object FooTheory.SampleInputPipelineLib.Customer(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Hensel&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)),
&lt;/span&gt;&lt;span style="color:#008080;"&gt;3&lt;/span&gt; &lt;span style="color:#000000;"&gt;                $(New&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Object FooTheory.SampleInputPipelineLib.Customer(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Banker&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)))
&lt;/span&gt;&lt;span style="color:#008080;"&gt;4&lt;/span&gt; &lt;span style="color:#000000;"&gt;$myCustomer &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Contact &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; Format&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Table &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Property FirstName, LastName, CompanyName &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Autosize&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;As you can see, this script produces the correct output:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:876ff331-0f52-449c-b7b8-21564f3761b4" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#C4C4FF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;79&lt;/span&gt;&lt;span style="color:#000000;"&gt;# .\SampleObjectTest.ps1

FirstName LastName CompanyName
&lt;/span&gt;&lt;span style="color:#000000;"&gt;---------&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;--------&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-----------&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Brian     Hensel   Stat&amp;#234;ra
Chris     Banker   Stat&amp;#234;ra&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;HelpMessage&lt;/font&gt;: This argument provides a short description for this parameter.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;
&lt;p&gt;In addition to the&lt;font face="Courier New" size="2"&gt; [Parameter]&lt;/font&gt; attribute, we also specify a attribute of type &lt;font face="Courier New" size="2"&gt;System.Management.Automation.ValidateNotNullOrEmptyAttribute&lt;/font&gt;. This attribute validates that the argument of an optional parameter is not null, an empty string or an empty collection.&lt;/p&gt;
&lt;p&gt;The last attribute is of type &lt;font face="Courier New" size="2"&gt;System.Management.Automation.AliasAttribute&lt;/font&gt;. This attribute allows us to define an alias for the parameter, in this case we specified "&lt;font face="Courier New" size="2"&gt;ln&lt;/font&gt;" as an alias for "LastName", as is shown below:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:9c18d4b0-1ec7-47ee-9d6f-e8c19eb4777d" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#B7B7FF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;# &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;contact &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;ln Banker &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; ft FullName, Email1Address &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;auto

FullName     Email1Address
&lt;/span&gt;&lt;span style="color:#000000;"&gt;--------&lt;/span&gt;&lt;span style="color:#000000;"&gt;     &lt;/span&gt;&lt;span style="color:#000000;"&gt;-------------&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Chris Banker &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;o&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;StatOrg&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;ou&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;First Administrative Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;Recipients&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;cn&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;cbanker
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Adding the attributes as specified above is the only thing we need to do to get all this functionality! The only feature which requires just a little bit of work is support for wildcard arguments, which is a topic we will tackle next.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Important note:&lt;/strong&gt; Whenever you are re-building your cmdlet, make sure that you exit all of your PowerShell console instances. Otherwise, you will not be able to successfully build your cmdlet, since it will be locked by the PowerShell instance(s).&lt;/p&gt;
&lt;h5&gt;Adding Support for Wildcard Arguments&lt;/h5&gt;
&lt;p&gt;To support wildcards and wilcard expansion, the PowerShell SDK offers the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.management.automation.wildcardpattern.aspx" target="_blank"&gt;System.Management.Automation.WildcardPattern&lt;/a&gt; class. The matching process itself&amp;nbsp;is controlled by the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.management.automation.wildcardoptions.aspx" target="_blank"&gt;System.Management.Automation.WildcardOptions&lt;/a&gt; flags enumeration. The enumeration supports the following options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;Compiled&lt;/font&gt;. When this option is selected, the wildcard pattern is compiled into an assembly, which yields faster execution, but will increase startup time a bit. 
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;IgnoreCase&lt;/font&gt;. When this option is selected, the matching is performed in a case-insensitive manner. 
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;None&lt;/font&gt;. When this option is selected, no special processing is performed.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;In our implementation, we will select a combination of the &lt;font face="Courier New" size="2"&gt;Compiled&lt;/font&gt; and &lt;font face="Courier New" size="2"&gt;IgnoreCase&lt;/font&gt; flags, so we will do a case-insensitive matching. To create an instance of the &lt;font face="Courier New" size="2"&gt;WilcardPattern&lt;/font&gt; class, you pass in the pattern, and the selected options, as is shown below:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:7cd8b121-8f4a-4de7-80b6-6c27e89efa5e" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#DFDFDF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Loop over all names&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; lastName &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; lastNames)
                    {
                        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Perform the  Wildcard expansion, and add the ContactItem
                        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; if we have a match&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;                        WildcardPattern wildcard &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; WildcardPattern(lastName, options);
                       .......
                    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here, we are looping over each last name in our array, and we create a &lt;font face="Courier New" size="2"&gt;WildcardPattern&lt;/font&gt; for each last name (which might contain a wildcard pattern).&lt;/p&gt;
&lt;p&gt;The WildcardPattern class supports a &lt;a href="http://msdn2.microsoft.com/en-us/library/system.management.automation.wildcardpattern.ismatch.aspx" target="_blank"&gt;IsMatch()&lt;/a&gt; method, which returns true if a match is found:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:70b10eae-8568-4b5c-beea-2d64d020a5b4" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#DBDBDB;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;                        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (contactItem.LastName &lt;/span&gt;&lt;span style="color:#000000;"&gt;!=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; wildcard.IsMatch(contactItem.LastName))
                        {
                            contacts.Add(contactItem);
                            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
                        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here, we pass in the &lt;font face="Courier New" size="2"&gt;LastName&lt;/font&gt; of the current contact into the&lt;font face="Courier New" size="2"&gt; IsMatch()&lt;/font&gt; method, and add the contact to our list of results&amp;nbsp; when a match is found.&lt;/p&gt;
&lt;p&gt;Our full implementation of the &lt;font face="Courier New" size="2"&gt;GetContacts()&lt;/font&gt; method is shown below:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:9347ae4f-5394-47bd-aa68-aa553d2fb8f2" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E1E1E1;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This method returns our list of Contacts
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;internal&lt;/span&gt;&lt;span style="color:#000000;"&gt; List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ContactItem&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetContacts(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] lastNames)
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Create our output list of ContactItems &lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ContactItem&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; contacts &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ContactItem&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;();
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Get the contacts folders from the current Session&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            MAPIFolder contactsFolder &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;                m_Application.Session.GetDefaultFolder(OlDefaultFolders.olFolderContacts);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Set our wildcard options&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            WildcardOptions options &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; WildcardOptions.IgnoreCase &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;                                      WildcardOptions.Compiled;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Enumerate the Contact Items&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt; (ContactItem contactItem &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; contactsFolder.Items)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Did we want to filter on LastName?&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (lastNames &lt;/span&gt;&lt;span style="color:#000000;"&gt;!=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#000000;"&gt;                {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Loop over all names&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; lastName &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; lastNames)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;                        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Perform the  Wildcard expansion, and add the ContactItem
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#008000;"&gt;                        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; if we have a match&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;                        WildcardPattern wildcard &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; WildcardPattern(lastName, options);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="color:#000000;"&gt;                        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (contactItem.LastName &lt;/span&gt;&lt;span style="color:#000000;"&gt;!=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; wildcard.IsMatch(contactItem.LastName))
&lt;/span&gt;&lt;span style="color:#008080;"&gt;31&lt;/span&gt; &lt;span style="color:#000000;"&gt;                        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;32&lt;/span&gt; &lt;span style="color:#000000;"&gt;                            contacts.Add(contactItem);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;33&lt;/span&gt; &lt;span style="color:#000000;"&gt;                            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;34&lt;/span&gt; &lt;span style="color:#000000;"&gt;                        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;35&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;36&lt;/span&gt; &lt;span style="color:#000000;"&gt;                }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;37&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;38&lt;/span&gt; &lt;span style="color:#000000;"&gt;                {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;39&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; No filter, simply add the Contact Item&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;40&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;                    contacts.Add(contactItem);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;41&lt;/span&gt; &lt;span style="color:#000000;"&gt;                }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;42&lt;/span&gt; &lt;span style="color:#000000;"&gt;            } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; foreach&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;43&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;44&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; contacts;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;45&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;46&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method GetContacts&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;As you see, our implementation is rather simple, we check if a filter (&lt;font face="Courier New" size="2"&gt;lastNames&lt;/font&gt; array) was specified, if not, we add every contact, otherwise we just add those contacts that match our wildcard patterns.&lt;/p&gt;
&lt;h3&gt;Testing our Cmdlet&lt;/h3&gt;
&lt;p&gt;Below are a number of examples that test the wildcard processing of our cmdlet:&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:412bba48-649d-4372-8f0d-e22df3a83d97" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#7777FF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;11&lt;/span&gt;&lt;span style="color:#000000;"&gt;# Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Contact [a&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;c]&lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; Format&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Table &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Property LastName, FirstName, JobTitle

LastName                                FirstName                               JobTitle
&lt;/span&gt;&lt;span style="color:#000000;"&gt;--------&lt;/span&gt;&lt;span style="color:#000000;"&gt;                                &lt;/span&gt;&lt;span style="color:#000000;"&gt;---------&lt;/span&gt;&lt;span style="color:#000000;"&gt;                               &lt;/span&gt;&lt;span style="color:#000000;"&gt;--------&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Campbell                                Jeremy                                  VP of Strategic Resources
Armour                                  Aendenne                                Consultant
Clint                                   Julie                                   Office Manager
Boocock                                 Eric                                    CRM Practice Director
Boswell                                 Malcolm                                 Client Partner
Citro                                   Mike                                    Consultant
Banker                                  Chris                                   Consultant
Blodgett                                Tony                                    Consultant


&lt;/span&gt;&lt;span style="color:#000000;"&gt;12&lt;/span&gt;&lt;span style="color:#000000;"&gt;# Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Contact [a&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;c]&lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt;er &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; Format&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Table &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Property LastName, FirstName, JobTitle

LastName                                FirstName                               JobTitle
&lt;/span&gt;&lt;span style="color:#000000;"&gt;--------&lt;/span&gt;&lt;span style="color:#000000;"&gt;                                &lt;/span&gt;&lt;span style="color:#000000;"&gt;---------&lt;/span&gt;&lt;span style="color:#000000;"&gt;                               &lt;/span&gt;&lt;span style="color:#000000;"&gt;--------&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Campbell                                Jeremy                                  VP of Strategic Resources
Miller                                  Pete                                    VP of Services
Armour                                  Aendenne                                Consultant
Clint                                   Julie                                   Office Manager
Boocock                                 Eric                                    CRM Practice Director
Boswell                                 Malcolm                                 Client Partner
Citro                                   Mike                                    Consultant
Jenner                                  Carol                                   Consultant
Banker                                  Chris                                   Consultant
Blodgett                                Tony                                    Consultant
Felker                                  Donn                                    Consultant


&lt;/span&gt;&lt;span style="color:#000000;"&gt;13&lt;/span&gt;&lt;span style="color:#000000;"&gt;# Get&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Contact &lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt;e&lt;/span&gt;&lt;span style="color:#000000;"&gt;??&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; Format&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Table &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt;Property LastName, FirstName, JobTitle

LastName                                FirstName                               JobTitle
&lt;/span&gt;&lt;span style="color:#000000;"&gt;--------&lt;/span&gt;&lt;span style="color:#000000;"&gt;                                &lt;/span&gt;&lt;span style="color:#000000;"&gt;---------&lt;/span&gt;&lt;span style="color:#000000;"&gt;                               &lt;/span&gt;&lt;span style="color:#000000;"&gt;--------&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Campbell                                Jeremy                                  VP of Strategic Resources
Boswell                                 Malcolm                                 Client Partner
Blodgett                                Tony                                    Consultant&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h3&gt;Summary&lt;/h3&gt;
&lt;p&gt;This concludes the development of our cmdlet. As you can see, the Windows PowerShell scripting language is a very powerful, productive&amp;nbsp;and highly customizable development environment. Developing custom cmdlets is very easy, since all of the hard work like parameter parsing, passing objects to the command line, wildcard expansion&amp;nbsp;etc. is performed by the PowerShell runtime.&lt;/p&gt;
&lt;p&gt;I hope you have enjoyed this article, and I encourage you to experiment with this environment, and I guarantee you that you will never go back to the "good old" Windows command prompt! And of course, feedback is always appreciated!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Technorati Tags:&lt;/strong&gt; &lt;a href="http://technorati.com/tag/PowerShell" rel="tag"&gt;PowerShell&lt;/a&gt; - &lt;a href="http://technorati.com/tag/Outlook%202007" rel="tag"&gt;Outlook 2007&lt;/a&gt; - &lt;a href="http://technorati.com/tag/COM%20Interop" rel="tag"&gt;COM Interop&lt;/a&gt;&lt;/p&gt;&lt;img src="http://footheory.com/aggbug.aspx?PostID=185" width="1" height="1"&gt;</content><author><name>bennie</name><uri>http://footheory.com/members/bennie.aspx</uri></author></entry><entry><title>Source Code and Final Version of C# 3.0, Part 6 Post are (Finally) Available!</title><link rel="alternate" type="text/html" href="http://footheory.com/blogs/bennie/archive/2007/09/03/source-code-and-final-version-of-c-3-0-part-6-post-are-finally-available.aspx" /><id>http://footheory.com/blogs/bennie/archive/2007/09/03/source-code-and-final-version-of-c-3-0-part-6-post-are-finally-available.aspx</id><published>2007-09-04T04:12:22Z</published><updated>2007-09-04T04:12:22Z</updated><content type="html">&lt;p&gt;Hello, it took a while, but I finally finished the "&lt;a href="http://footheory.com/blogs/bennie/archive/2007/08/18/new-features-in-c-3-0-part-6-expression-trees.aspx" target="_blank"&gt;Expression Trees&lt;/a&gt;" post, which is part 6 of the "New Features in C# 3.0&amp;nbsp;which enable LINQ" series. I also uploaded the &lt;a href="http://footheory.com/files/folders/csharpandlinq/entry175.aspx" target="_blank"&gt;sample code&lt;/a&gt; for those who are interested. If you read the version of the article of a few weeks back, and you are interested in the topic, I would recommend taking a look at the latter part of the post, I added some material on how to build dynamic queries.&lt;/p&gt; &lt;p&gt;So, what's next? In part 7 (the final installment of this series), we will take a look under the hood of a LINQ provider. The last section of my post hints on how such a provides goes about dynamically building a domain-specific query, and executing this "query" when the first result is accessed. But in this upcoming post, we will really dig into the bowels of how this is done, look at the interfaces involved in this process, and who knows, maybe we even write our own provider?&lt;/p&gt; &lt;p&gt;Take care..&lt;/p&gt;&lt;img src="http://footheory.com/aggbug.aspx?PostID=176" width="1" height="1"&gt;</content><author><name>bennie</name><uri>http://footheory.com/members/bennie.aspx</uri></author></entry><entry><title>New Features in C# 3.0, Part 6: Expression Trees</title><link rel="alternate" type="text/html" href="http://footheory.com/blogs/bennie/archive/2007/08/18/new-features-in-c-3-0-part-6-expression-trees.aspx" /><id>http://footheory.com/blogs/bennie/archive/2007/08/18/new-features-in-c-3-0-part-6-expression-trees.aspx</id><published>2007-08-19T00:33:23Z</published><updated>2007-08-19T00:33:23Z</updated><content type="html">&lt;h3&gt;Introduction&lt;/h3&gt; &lt;p&gt;In the &lt;a href="http://footheory.com/blogs/bennie/archive/2007/08/11/new-features-in-c-3-0-part-5-lambda-expressions.aspx" target="_blank"&gt;previous installment&lt;/a&gt; of this series, we looked at lambda expressions.&amp;nbsp;During our little trip down memory lane, we&amp;nbsp;concluded that lambda expressions are a logical evolution of anonymous functions, which in turn are (to some extent)&amp;nbsp;an evolution of delegates. In the context of this article, it is very important to understand that&amp;nbsp;lambda expressions are always directly compiled into IL code by the compiler, so a lambda expression is a representation of a unit of executable &lt;em&gt;code&lt;/em&gt;, it is not&amp;nbsp;a &lt;em&gt;data structure.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Below is an example of a lambda expression that calculates the volume of a box:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:5c4e0f6c-9fe1-4e1f-a3b6-562aa3cd821a" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E4E4E4;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; boxVolume &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
                (width, length, height) &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; width &lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt; length &lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt; height;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Next, let's take a look at this line of code:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:bd0ccc5e-4874-483e-b48b-98143a214a6b" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E6E6E6;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; volumeExpr &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
                (width, height, length) &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; m_width &lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt; m_height &lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt; m_length;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Essential, what we are doing in this line of code is taking our earlier lambda expression, and supplying it as the type argument for a generic type called &lt;font face="Courier New" size="2"&gt;Expression&amp;lt;T&amp;gt;.&lt;/font&gt; &lt;font face="Courier New" size="2"&gt;Expression&amp;lt;T&amp;gt;&lt;/font&gt; is defined in the &lt;font face="Courier New" size="2"&gt;System.Linq.Expressions &lt;/font&gt;namespace, and looks as follows:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:5997e716-4188-4eeb-8521-fda7d03ac196" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E5E5E5;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Summary:
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     Represents a strongly typed lambda expression as a data structure in the
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     form of an expression tree. This class cannot be inherited.
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Type parameters:
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;   TDelegate:
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     The type of the delegate that the System.Linq.Expressions.Expression&amp;lt;TDelegate&amp;gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     represents.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;sealed&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TDelegate&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; : LambdaExpression
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Summary:
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     Compiles the lambda expression described by the expression tree into executable
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     code.
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Returns:
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     A delegate of type TDelegate that represents the lambda expression described
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     by the System.Linq.Expressions.Expression&amp;lt;TDelegate&amp;gt;.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; TDelegate Compile();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;When you look at the comments for the class, you notice that an &lt;font face="Courier New" size="2"&gt;Expression&amp;lt;T&amp;gt;&lt;/font&gt; represents a lambda expression as a data structure in the form of an &lt;em&gt;&lt;strong&gt;expression tree&lt;/strong&gt;&lt;/em&gt;. So, rather than directly compiling the lambda expression into executable IL that can&amp;nbsp;directly evaluate the expression, what an &lt;font face="Courier New" size="2"&gt;Expression&amp;lt;T&amp;gt;&lt;/font&gt; does is&amp;nbsp;create an in-memory tree of objects that represents the expression that was supplied as its type argument.&lt;/p&gt;
&lt;p&gt;Now, when you look at the definition of &lt;font face="Courier New" size="2"&gt;Expression&amp;lt;T&amp;gt;&lt;/font&gt; you probably noticed it single method called &lt;font face="Courier New" size="2"&gt;Compile(). &lt;/font&gt;This method compiles the expression, and when the compilation is&amp;nbsp;successful,&amp;nbsp; generates the "real" lambda expression, which then in turn can be executed, because it really IS IL, ready to run! To&amp;nbsp;execute a compiled &lt;font face="Courier New" size="2"&gt;Expression&amp;lt;T&amp;gt;&lt;/font&gt; instance, just use it's &lt;font face="Courier New" size="2"&gt;Invoke()&lt;/font&gt; method, supplying the required parameters.&lt;/p&gt;
&lt;p&gt;An overview of this two-step process is shown below:&lt;/p&gt;
&lt;p&gt;&lt;a title="ExpressionTreesOverview" href="http://www.flickr.com/photos/99548241@N00/1164578354/"&gt;&lt;img height="362" alt="ExpressionTreesOverview" src="http://static.flickr.com/1011/1164578354_49d87e86d5.jpg" width="500" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The in-memory representation of an &lt;font face="Courier New" size="2"&gt;Expression&amp;lt;T&amp;gt;&lt;/font&gt; is an expression tree, as is shown in the above figure.&lt;/p&gt;
&lt;p&gt;Microsoft actually made a visualizer available, which&amp;nbsp;is very useful&amp;nbsp;for analyzing the structure of an expression tree. A screen shot of the visualizer for our expression looks as follows:&lt;/p&gt;
&lt;p&gt;&lt;a title="ss" href="http://www.flickr.com/photos/99548241@N00/1164964848/"&gt;&lt;img alt="ss" src="http://static.flickr.com/1301/1164964848_7528e718cd_b.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Getting the Expression Tree Visualizer up and running in Orcas&amp;nbsp;Beta 2&lt;/h4&gt;
&lt;p&gt;In Beta 2 of Orcas, the expression tree visualizer is NOT installed by default. But fear not, and follow these steps to get the visualizer to work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you are running the Orcas Beta 2 VPC image, go to the directory:&lt;font face="Courier New" size="2"&gt; C:\Program Files\Microsoft Visual Studio 9.0\Samples\1033&lt;/font&gt;. Otherwise, go to the directory where you have Oracas installed. 
&lt;li&gt;In this directory, you will find a file called &lt;font face="Courier New" size="2"&gt;CSharpSamples.zip&lt;/font&gt;. Unzip this file to your preferred directory (I created a sub-directory &lt;font face="Courier New" size="2"&gt;CSharpSamples&lt;/font&gt; under the above directory). 
&lt;li&gt;After you unzipped the file, move to the sub-directory &lt;font face="Courier New" size="2"&gt;LinqSamples&lt;/font&gt;, in this sub-directory you will find another subdirectory called &lt;font face="Courier New" size="2"&gt;ExpressionTreeVisualizer&lt;/font&gt;. Go to this sub-directory. 
&lt;li&gt;In the &lt;font face="Courier New" size="2"&gt;ExpressionTreeVisualizer&lt;/font&gt; sub-directory, you will find a solution called &lt;font face="Courier New" size="2"&gt;ExpressionTreeVisualizer.sln&lt;/font&gt;. Open and build this solution. 
&lt;li&gt;After the build successfully completes, move to the &lt;font face="Courier New" size="2"&gt;\ExpressionTreeVisualizer\bin\Debug&lt;/font&gt; sub-directory. In this directory, you will find a file called &lt;font face="Courier New" size="2"&gt;ExpressionTreeVisualizer.dll&lt;/font&gt;. This is the actual visualizer &lt;font face="Courier New" size="2"&gt;dll&lt;/font&gt; used by Visual Studio. 
&lt;li&gt;Copy the &lt;font face="Courier New" size="2"&gt;ExpressionTreeVisualizer.dll&lt;/font&gt; to the&lt;font face="Courier New" size="2"&gt; C:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Visualizers&lt;/font&gt; directory (if not logged in as &lt;font face="Courier New" size="2"&gt;administrator&lt;/font&gt;, substitute &lt;font face="Courier New" size="2"&gt;administrator&lt;/font&gt; with your user name. This is the location where all Visual Studio visualizers live for your Visual Studio installation. 
&lt;li&gt;After you have completed the above steps, and have restarted Visual Studio, the following will happen when you are&amp;nbsp;debugging an application with an &lt;font face="Courier New" size="2"&gt;Expression&amp;lt;T&amp;gt;&lt;/font&gt; instance, and you have a breakpoint on a unit of code with an &lt;font face="Courier New" size="2"&gt;Expression&amp;lt;T&amp;gt;:&lt;/font&gt; 
&lt;ul&gt;
&lt;li&gt;You will see the "Looking glass" icon, indicating that a visualizer is available for the object under the cursor. 
&lt;li&gt;Click the looking glass icon. 
&lt;li&gt;The "Expression Tree&amp;nbsp;Visualizer" selector will pop up, as shown below:&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a title="LookingGlass" href="http://www.flickr.com/photos/99548241@N00/1164253915/"&gt;&lt;img alt="LookingGlass" src="http://static.flickr.com/1440/1164253915_a63eef87ce_b.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;Click the&amp;nbsp;pop-up, and the visualizer will show the expression tree in all of its beauty, as shown earlier.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;
&lt;h3&gt;Creating Expression Trees&lt;/h3&gt;
&lt;p&gt;You can create an expression tree in two different ways:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You can write an &lt;font face="Courier New" size="2"&gt;Expression&amp;lt;T&amp;gt;&lt;/font&gt; as we did in our example in the previous section. by assigning an &lt;font face="Courier New" size="2"&gt;Expression&amp;lt;T&amp;gt;&lt;/font&gt; instance to a lambda expression. As we saw in the visual studio visualizer, the C# compiler automatically generated (in this case a quite elaborate) expression&amp;nbsp;tree for us. 
&lt;li&gt;You can use the Expression API in the&amp;nbsp;&lt;font face="Courier New" size="2"&gt;System.Linq.Expressions&lt;/font&gt; namespace to manually build your own expressions. While this quite a bit more complicated and time-consuming, it does open up all kinds of possibilities, as we will see in the "Dynamic Queries" section of this post.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;We will take a closer look at each approach in the next sections.&lt;/p&gt;
&lt;h4&gt;Creating an expression tree based upon a lambda expression&lt;/h4&gt;
&lt;p&gt;The first approach to creating expression trees is fairly easy. You write a valid lambda expression, and supply it as the type argument to an &lt;font face="Courier New" size="2"&gt;Expression&amp;lt;T&amp;gt;&lt;/font&gt; instance. This is illustrated by the following code sample (this is the &lt;font face="Courier New" size="2"&gt;SimpleExample&lt;/font&gt; class in the &lt;font face="Courier New" size="2"&gt;SimpleExpressionTrees&lt;/font&gt; project of our &lt;a href="http://footheory.com/files/folders/csharpandlinq/entry175.aspx" target="_blank"&gt;sample code&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:d0cf9eca-de00-42e4-a8ae-bc0f94af7065" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#DFDFDF;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This method shows how you can create an expression, based upon
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; a Lambda Expression
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; CreateExpressionFromLamba()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; This is how you declare a lambda expression by itself&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; addLambda &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (value1, value2) &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; value1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; value2;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; This is how you declare an equivalent lambda expression&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            Expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; lambdaExpression &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (value1, value2) &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; value1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; value2;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Lambda Expression: {0}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, lambdaExpression.ToString());
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;            dumpExpression(lambdaExpression);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Compile and execute the lambda expression in the Expression&amp;lt;T&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; lambda &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; lambdaExpression.Compile();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; v1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; v2 &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Compiling and executing the expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;{0} + {1} = {2}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, v1, v2, lambda.Invoke(v1, v2));
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Note how I can use statements in a lambda expression&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; compareLambda &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#000000;"&gt;                (val1, val2) &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (val1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; val2)  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;; };
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#000000;"&gt;           
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; The statement below will not compile, since you cannot use
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; a lambda expressions with a statement to create an expression tree
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;Expression&amp;lt;Func&amp;lt;int, int, bool&amp;gt;&amp;gt; compareExpression =
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;    (val1, val2) =&amp;gt; { if (val1 == val2)  return true; else return false; };&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        
&lt;/span&gt;&lt;span style="color:#008080;"&gt;31&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method CreateExpressionFromLamba&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;In line 8, we create a simply lambda expression which adds the two integers passed as arguments. In line 11, I create an expression tree, based upon an identical lambda expression. Note also, how Expression&amp;lt;T&amp;gt; has a handy &lt;font face="Courier New" size="2"&gt;ToString()&lt;/font&gt; override which shows the lambda expression. The output of line&amp;nbsp;12 is shown below:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:6ceace39-2c16-47ff-9fd3-7707e0b84899" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E4E4E4;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Lambda Expression: (value1, value2) &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; (value1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; value2)&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;So, what&amp;nbsp; we get is a neat representation of the lambda expression on which the expression is based.&amp;nbsp;To add some functionality to this I&amp;nbsp;created a simple little &lt;font face="Courier New" size="2"&gt;dumpBLOCKED EXPRESSION&lt;/font&gt; function which prints out the details of an expression. The code for this method is shown below:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:eedea36a-039e-4b3f-b3ae-303af341d3b6" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E2E2E2;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This method prints out the details of the passed-in Expression
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;typeparam name=&amp;quot;T&amp;quot;&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;param name=&amp;quot;expression&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; dumpExpression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(Expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; expression)
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Lambda Expression: {0}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, expression.ToString());
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Expression Details: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\tExpression Body: {0}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, expression.Body);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; index &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;; index &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; expression.Parameters.Count; index&lt;/span&gt;&lt;span style="color:#000000;"&gt;++&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;                var parameter &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; expression.Parameters[index];
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;                Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\tParameter {0}: '{1}', Type: {2}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    index, parameter, parameter.Type.Name);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\tNodeType: {0}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, expression.NodeType);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;This code sample shows some interesting properties of the &lt;font face="Courier New" size="2"&gt;Expression&amp;lt;T&amp;gt;&lt;/font&gt; class:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The &lt;font face="Courier New" size="2"&gt;Body&lt;/font&gt; property of the &lt;font face="Courier New" size="2"&gt;Expression&amp;lt;T&amp;gt;&lt;/font&gt; gives us the body of the lambda expression. 
&lt;li&gt;The &lt;font face="Courier New" size="2"&gt;Parameters&lt;/font&gt; property returns a &lt;font face="Courier New" size="2"&gt;ReadOnlyCollection&amp;lt;T&amp;gt;&lt;/font&gt; where T is of type &lt;font face="Courier New" size="2"&gt;ExpressionParameter&lt;/font&gt;. The code simply loops over each parameter, and prints the index, name and type of each parameter.&amp;nbsp; 
&lt;li&gt;Finally, the &lt;font face="Courier New" size="2"&gt;NodeType&lt;/font&gt; property provides the Node Type of the Expression. We'll have more to say about Node Types in the next section.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;When we pass our expression to this function, we get the following output, which correctly represents our expression instance.&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:ea0e82cc-3b00-462e-8563-5e6cd038cbaf" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#DBDBDB;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Lambda Expression: (value1, value2) &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; (value1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; value2)
Expression Details:
        Expression Body: (value1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; value2)
        Parameter &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;: &lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;value1&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Type: Int32
        Parameter &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;: &lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;value2&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Type: Int32
        NodeType: Lambda&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When the invoke the &lt;font face="Courier New" size="2"&gt;Expression&amp;lt;T&amp;gt; Compile()&lt;/font&gt; method, we get our original lambda expression back, as is shown below:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:a89491bf-27ac-465d-81e2-72edd4f981f6" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#DBDBDB;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; lambda &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; lambdaExpression.Compile();&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Next, we can invoke the lambda&amp;nbsp; expression directly with it's &lt;font face="Courier New" size="2"&gt;Invoke()&lt;/font&gt; method:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:ab2980a6-aef7-4e4f-9c4e-54fa3574f414" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#D8D8D8;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; v1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; v2 &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Compiling and executing the expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;{0} + {1} = {2}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, v1, v2, lambda.Invoke(v1, v2));&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;which produces our expected output:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:5b06f249-7d48-4d42-92f4-f13f0de6e760" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E6E6E6;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Compiling and executing the expression
&lt;/span&gt;&lt;span style="color:#000000;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;15&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When we go back to our first listing, we see that we can also create a lambda expression, based upon a statement, instead of a simple expression:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:c215e28d-8060-4d3f-9388-424bf41b2ec0" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#DFDFDF;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Note how I can use statements in a lambda expression&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; compareLambda &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt;3&lt;/span&gt; &lt;span style="color:#000000;"&gt;                (val1, val2) &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (val1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; val2)  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;; };&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;However, you cannot use a lambda expression with a statement to initialize an expression.&amp;nbsp;If I would attempt to compile a function with the following statement:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:fb69b878-4a39-4132-9c2a-cd3da9f7c473" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E2E2E2;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; The statement below will not compile, since you cannot use
            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; a lambda expressions with a statement to create an expression tree&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;            Expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; compareExpression &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;
                (val1, val2) &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (val1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; val2)  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;; };&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The you would get&amp;nbsp;the following compilation error:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:7e26a603-37dd-491f-93f6-3ea407936a6f" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#FFBFBF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Error    &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;    A lambda expression with a statement body cannot be converted to an expression tree    SimpleExpressionTrees
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Manually Creating an Expression Tree&lt;/h4&gt;
&lt;p&gt;The &lt;font face="Courier New" size="2"&gt;System.Linq.Expression&lt;/font&gt; namespace offers a rich API, which allows you to dynamically build an expression tree of arbitrary complexity, without the limitations mentioned in the previous section. For example, the code sample below, shows how to use this API to build exactly the&amp;nbsp;same expression as we did earlier in the first example of the &lt;font face="Courier New" size="2"&gt;CreateExpressionFromLamba()&lt;/font&gt; method:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:c4124274-a694-49df-8382-c9c1854805af" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E6E6E6;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; In this example, we build exactly the same expression as we 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; did in the first example of the CreateExpressionFromLamba()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; function
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ManuallyBuildBLOCKED EXPRESSION
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\n\nManually Building an expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;  First, create the parameter expressions&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            ParameterExpression val1Expr &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; Expression.Parameter(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;), &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;value1&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;            ParameterExpression val2Expr &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; Expression.Parameter(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;), &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;value2&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Create the &amp;quot;add&amp;quot; expression&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            BinaryExpression addExpr &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; BinaryExpression.Add(val1Expr, val2Expr);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;            
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Wrap the add expression in a Lambda expression&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            var lambdaExpr &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;                Expression.Lambda&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    addExpr, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; ParameterExpression[] {val1Expr, val2Expr});
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Dump the expression&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            dumpExpression(lambdaExpr);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Compile and execute the lambda expression in the Expression&amp;lt;T&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; lambda &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; lambdaExpr.Compile();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; v1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; v2 &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Compiling and executing the expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;{0} + {1} = {2}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, v1, v2, lambda.Invoke(v1, v2));
&lt;/span&gt;&lt;span style="color:#008080;"&gt;31&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;32&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method ManuallyBuildExpression&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As you can see, the code is definitely more verbose, but not necessarily complicated. First, we create two &lt;font face="Courier New"&gt;ParameterExpressions&lt;/font&gt; to represent the &lt;font face="Courier New" size="2"&gt;value1&lt;/font&gt; and &lt;font face="Courier New" size="2"&gt;value2&lt;/font&gt; parameters to the lambda expression. Next, we create an&amp;nbsp;&lt;font face="Courier New" size="2"&gt;Add&amp;nbsp;BinaryExpression&lt;/font&gt;, which adds both values together. The &lt;font face="Courier New" size="2"&gt;BinaryExpression&lt;/font&gt; class has 17 overloads, which allow you to create just about any binary expression you would ever need.&lt;/p&gt;
&lt;p&gt;Finally, we wrap our expression into a lambda expression, which is ultimately what we were planning to do from the start. Note that we need to specify the correct lambda prototype as type argument. The function arguments are the Binary Add expression, and both of our Parameter Expressions.&lt;/p&gt;
&lt;p&gt;To verify that we indeed created the correct expression, we passed our expression on to our trusted &lt;font face="Courier New" size="2"&gt;dumpBLOCKED EXPRESSION&lt;/font&gt; function. Here is the output:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:82521054-85f7-4de8-8657-ab5944fb7fe3" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#DBDBDB;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Lambda Expression: (value1, value2) &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; (value1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; value2)
Expression Details:
        Expression Body: (value1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; value2)
        Parameter &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;: &lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;value1&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Type: Int32
        Parameter &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;: &lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;value2&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Type: Int32
        NodeType: Lambda&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;And indeed, the output of our manually created expression tree is identical to our first expression, created directly from a lambda expression! An naturally, we can compile and invoke the expression as we did in our previous example.&lt;/p&gt;
&lt;h3&gt;Using Expression Trees to create&amp;nbsp;Dynamic&amp;nbsp;&amp;nbsp;Query Expressions&lt;/h3&gt;
&lt;p&gt;One of the interesting applications of expression trees, is the enablement of more dynamic LINQ queries. The &lt;font face="Courier New" size="2"&gt;DynamicQueryWithExpression&lt;/font&gt; class of the &lt;a href="http://footheory.com/files/folders/csharpandlinq/entry175.aspx" target="_blank"&gt;sample code&lt;/a&gt; illustrates this. The constructor of this class generates an integer array with 20 elements, as is shown below:&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:a68bb5cc-6a11-4ba0-80a8-8e49c74c888f" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E4E4E4;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; DynamicQueryWithExpressions()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;3&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; i &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;; i &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;20&lt;/span&gt;&lt;span style="color:#000000;"&gt;; i&lt;/span&gt;&lt;span style="color:#000000;"&gt;++&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;4&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;5&lt;/span&gt; &lt;span style="color:#000000;"&gt;                m_myInts.Add(i);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;6&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;7&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;8&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\nDynamic Query Example&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;9&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; constructor&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;The &lt;font face="Courier New" size="2"&gt;SimpleQuery()&lt;/font&gt; method performs a query against this list, retrieving all elements that are between 5 and 15 exclusive: &lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:cc3a5b08-7c1c-475f-9b62-b6ba73d5533d" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E2E2E2;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This method executes a simple, very straightforward query
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; SimpleQuery()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;            var results &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; from i &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; m_myInts
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;                            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;where&lt;/span&gt;&lt;span style="color:#000000;"&gt; i &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; i &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;15&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;                                orderby i
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;                                    select i;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;            showResults(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;SimpleQuery&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, results);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;        
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method  SimpleQuery&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;The output from this query is shown below:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:625b3a8c-f9a0-4625-95ab-40f551b6bb4e" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E4E4E4;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Results from query: QueryWithDynamicParameters
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;7&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;9&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;11&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#000000;"&gt;14&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This query contains a very simple &lt;font face="Courier New" size="2"&gt;where&lt;/font&gt; clause that specifies our range. But what if we have a situation where we do not know at compile time what numbers we need? We might want to &lt;em&gt;include&lt;/em&gt; some number, and at the same time, we might want to &lt;em&gt;exclude&lt;/em&gt; some other numbers. Furthermore, the user might want to specify these numbers at runtime, through some type of user interface. In such a scenario, the above simple query construct will no longer work for us.&lt;/p&gt;
&lt;p&gt;Scenario's such as the one describe above are a custom fit for custom expressions. As we mentioned before, we can construct any &lt;font face="Courier New" size="2"&gt;Expresssion&amp;lt;T&amp;gt;&lt;/font&gt; -based expression tree we want, of arbitrarily deep complexity. In the above example, what we have a need for is a way to build &lt;font face="Courier New" size="2"&gt;AND&lt;/font&gt; and &lt;font face="Courier New" size="2"&gt;OR&lt;/font&gt; expression "chains". One we can build these expression, we can build ourselves a "power where clause" we can use for our query.&lt;/p&gt;
&lt;p&gt;I started writing a class to build these types of predicates, but then I came across a beautiful implementation by &amp;nbsp;&lt;a href="http://www.albahari.com/expressions/" target="_blank"&gt;Josheph Albhari,&lt;/a&gt; and I decided that this was so nicely done that there was no way to improve upon his code, so credit where credit is due. By the way, I really recommend Joseph &lt;a href="http://www.albahari.com/" target="_blank"&gt;Albhari's blog&lt;/a&gt;, he has some great C# 3.0 examples in there. The name of his class is &lt;font face="Courier New" size="2"&gt;PredicateBuilder&lt;/font&gt;, and the code is shown below:&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:789cf3d0-cecf-4954-82a4-8ce73e39fdfb" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E4E4E4;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Collections.Generic;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Linq;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Linq.Expressions;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; SimpleExpressionTrees
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This class allows us to build AND and OR expressions 
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; PredicateBuilder
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; These expressions define a true or false expression, which are
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; used as &amp;quot;anchor&amp;quot; expressions for build or AND or OR predicates&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; Expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; True&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;() { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; f &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; Expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; False&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;() { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; f &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This Extension method creates an OR Expression
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;typeparam name=&amp;quot;T&amp;quot;&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;param name=&amp;quot;expr1&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;param name=&amp;quot;expr2&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; Expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Or&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt; Expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; expr1,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;                                                           Expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; expr2)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Invoke the second expression, passing in the parameters of the first expression&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            var invokedExpr &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; Expression.Invoke(expr2, expr1.Parameters.Cast&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;());
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;31&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Create the Or Expression, and wrap it in a Lamba expression&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;32&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; Expression.Lambda&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;33&lt;/span&gt; &lt;span style="color:#000000;"&gt;                  (Expression.Or(expr1.Body, invokedExpr), expr1.Parameters);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;34&lt;/span&gt; &lt;span style="color:#000000;"&gt;        
&lt;/span&gt;&lt;span style="color:#008080;"&gt;35&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method Or&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;36&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;37&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;38&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This Extension method creates an AND expression
&lt;/span&gt;&lt;span style="color:#008080;"&gt;39&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;40&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;typeparam name=&amp;quot;T&amp;quot;&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;41&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;param name=&amp;quot;expr1&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;42&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;param name=&amp;quot;expr2&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;43&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;44&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; Expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; And&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt; Expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; expr1,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;45&lt;/span&gt; &lt;span style="color:#000000;"&gt;                                                            Expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; expr2)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;46&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;47&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Invoke the second expression, passing in the parameters of the first expression&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;48&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            var invokedExpr &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; Expression.Invoke(expr2, expr1.Parameters.Cast&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;());
&lt;/span&gt;&lt;span style="color:#008080;"&gt;49&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;50&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Create the And Expression, and wrap it in a Lamba expression&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;51&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; Expression.Lambda&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;52&lt;/span&gt; &lt;span style="color:#000000;"&gt;                  (Expression.And(expr1.Body, invokedExpr), expr1.Parameters);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;53&lt;/span&gt; &lt;span style="color:#000000;"&gt;        
&lt;/span&gt;&lt;span style="color:#008080;"&gt;54&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method And&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;55&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;56&lt;/span&gt; &lt;span style="color:#000000;"&gt;    } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; class PredicateBuilder&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;57&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;} &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;namespace SimpleExpressionTrees
&lt;/span&gt;&lt;span style="color:#008080;"&gt;58&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;In lines 15 and 16, we have&amp;nbsp;a &lt;font face="Courier New" size="2"&gt;True&lt;/font&gt; and a&amp;nbsp;&lt;font face="Courier New" size="2"&gt;False&lt;/font&gt; static Expression, which can be used an "anchor points" for building an AND or and OR expression chain. The implementations of both the &lt;font face="Courier New" size="2"&gt;And&lt;/font&gt; and the &lt;font face="Courier New" size="2"&gt;Or&lt;/font&gt; methods is very elegant and straightforward. First (in lines 29 and 48), we create an &lt;font face="Courier New" size="2"&gt;InvocationExpression&lt;/font&gt;,&amp;nbsp; passing in the second expression and their parameters. Next, we create a &lt;font face="Courier New" size="2"&gt;BinaryExpression&lt;/font&gt; by performing and &lt;font face="Courier New" size="2"&gt;And&lt;/font&gt; or an &lt;font face="Courier New" size="2"&gt;Or&lt;/font&gt;&amp;nbsp; between the body of our first expression and the &lt;font face="Courier New" size="2"&gt;InvocationExpression&lt;/font&gt; created earlier (lines 32 and 51), and then wrap the result in a Lambda Expression. The above class can be found in the &lt;font face="Courier New" size="2"&gt;PredicateBuilder.cs&lt;/font&gt; class of the &lt;a href="http://footheory.com/files/folders/csharpandlinq/entry175.aspx" target="_blank"&gt;sample code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Based upon this &lt;font face="Courier New" size="2"&gt;PredicateBuilder&lt;/font&gt; class, I created a method in the &lt;font face="Courier New" size="2"&gt;DynamicQueryWithExpressions&lt;/font&gt; class that can build an OR filter chain. The code for this method is shown below:&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:c2f55be9-dae9-4e29-bf5d-862f20102c0d" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E1E1E1;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This method builds up a dynamic expression with OR statements
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; for each number that should be included. It uses the PredicateBuilder
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; to build to expression
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;param name=&amp;quot;numbersToInclude&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; Expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; filterByIntList(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;params&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] numbersToInclude)
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Since we are building OR statements, we start out with a FALSE expression,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; otherwise our OR statement would always evaluate to true..&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            var predicate &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; PredicateBuilder.False &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; ();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Loop over each number to include, and add an OR predicate
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; to the expression&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; index &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt; ; index &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; numbersToInclude.Length; index&lt;/span&gt;&lt;span style="color:#000000;"&gt;++&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; value &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; numbersToInclude[index];
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;                predicate &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; predicate.Or(i &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; i &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; value);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; predicate;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method filterByIntList&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;In line 12, we set our "anchor expression", which should be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;False&lt;/font&gt; if we are building an OR filter chain (otherwise our result would always be true).&lt;/li&gt;
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;True&lt;/font&gt; is we are building an AND filter chain (otherwise our result would always be false)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;We get the arguments to include&amp;nbsp;in the &lt;font face="Courier New" size="2"&gt;numbersToInclude&lt;/font&gt; &lt;font face="Courier New" size="2"&gt;params&lt;/font&gt; array, so we simply need to loop over each element of the array, and invoke the &lt;font face="Courier New" size="2"&gt;predicate.Or()&lt;/font&gt; method with the lambda expression:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;i =&amp;gt; i == value&lt;/font&gt; &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;as argument. This lamda expression will guarantee that our value is included in the results if it is present in the&amp;nbsp;source array.&amp;nbsp;So, in effect what we are doing during this loop is building and expression which gets more and more complex, and finally includes all values that should be used in the &lt;font face="Courier New" size="2"&gt;Where&lt;/font&gt; clause of our query.&lt;/p&gt;
&lt;p&gt;Below is then finally the query which uses this expression:&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:b70a542a-11c4-4000-9d5e-6ef8713de300" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E9E9E9;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This method extends our query with dynamic and and or elements
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;param name=&amp;quot;numbersToFind&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; QueryWithDynamicParameters(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;params&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] numbersToInclude)
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; predicate &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; filterByIntList(numbersToInclude);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; isInArray &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; predicate.Compile();
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            var results &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; from value &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; m_myInts.Where(isInArray)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;                          &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;where&lt;/span&gt;&lt;span style="color:#000000;"&gt; value &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; value &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;15&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;                          orderby value
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;                          select value;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;            showResults(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;QueryWithDynamicParameters&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, results);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method QueryWithDynamicParameters&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;in line 7 be invoke our method to create our expression,&amp;nbsp; and in line 8, we compile the expression, which gives us back a lambda expression. Note that we selected to actually apply the lambda expression directly on the &lt;font face="Courier New" size="2"&gt;m_myInts&lt;/font&gt; array, so we can use the power of a "standard, static" where clause together&amp;nbsp;with the power of a dynamically created expression.&amp;nbsp; The application of the Where condition on the array effectively invokes the following extension method of IEnumerable&amp;lt;T&amp;gt;:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:0b6b7fe0-e557-4808-8f30-b4e0bc4712be" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E1E1E1;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; IEnumerable&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TSource&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Where&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TSource&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt; IEnumerable&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TSource&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; source, Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TSource, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; predicate);&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The invocation of this method and the results are shown below:&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:c58bbbc3-dc0b-4cfe-9162-9f3e1b312434" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E2E2E2;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; These examples show how to create a dynamic
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; query with an Expression&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            DynamicQueryWithExpressions dynQuery &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; DynamicQueryWithExpressions();
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;            ....
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;            dynQuery.QueryWithDynamicParameters(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] { &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;7&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;9&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;11&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;14&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;17&lt;/span&gt;&lt;span style="color:#000000;"&gt; });
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;Results from query: QueryWithDynamicParameters
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#000000;"&gt;7&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#000000;"&gt;9&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#000000;"&gt;11&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#000000;"&gt;14&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;As you see, all supplied values are included except for 2 and 17, because they do not satisfy the "static" where clause.&lt;/p&gt;
&lt;p&gt;The above example is very simple, but you can see how you could easily build powerful expression generators with classes like the &lt;font face="Courier New" size="2"&gt;PredicateBuilder&lt;/font&gt;.&lt;/p&gt;
&lt;h3&gt;Expression Trees and LINQ Query Providers&lt;/h3&gt;
&lt;p&gt;Besides enabling you to create dynamic queries, expression trees are also used in a "deferred execution" mode in LINQ. For example, in LINQ to SQL, here is the sequence of events:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The user writes a method which contains a LINQ-to-SQL query. 
&lt;li&gt;The compiler compiles the SQL-like query into a sequence of method calls. 
&lt;li&gt;The compiler then compiles the series of method calls&amp;nbsp;into an expression tree. 
&lt;li&gt;The expression trees is used by the LINQ-to-SQL infrastructure to create an optimized T-SQL statement. So, in this case, the expression tree is NEVER directly executed, it is simply used as a rich data structure, from which we can create a Transact-SQL query. 
&lt;li&gt;The first time the results of the query are actually accessed, the SQL Statement is sent to the designated SQL server and executed, and the results are returned to the client.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Note that the above description is greatly simplified. The next (and final) installment of this series will dive deep into the bowels of the interfaces and classes that enable all of this to happen. Also, note that this model is not necessarily limited to LINQ-to-SQL. Most (if not all) LINQ providers use an identical model where some type of query is created from the expression tree, and executed when the results of the query are first accessed.&lt;/p&gt;&lt;img src="http://footheory.com/aggbug.aspx?PostID=168" width="1" height="1"&gt;</content><author><name>bennie</name><uri>http://footheory.com/members/bennie.aspx</uri></author><category term="C#" scheme="http://footheory.com/blogs/bennie/archive/tags/C_2300_/default.aspx" /><category term="C# 3.0" scheme="http://footheory.com/blogs/bennie/archive/tags/C_2300_+3.0/default.aspx" /><category term="LINQ" scheme="http://footheory.com/blogs/bennie/archive/tags/LINQ/default.aspx" /></entry><entry><title>New Features in C# 3.0, Part 5: Lambda Expressions Source Code is Now Available</title><link rel="alternate" type="text/html" href="http://footheory.com/blogs/bennie/archive/2007/08/14/code-for-new-features-in-c-3-0-par-5-lambda-expressions-now-available.aspx" /><id>http://footheory.com/blogs/bennie/archive/2007/08/14/code-for-new-features-in-c-3-0-par-5-lambda-expressions-now-available.aspx</id><published>2007-08-15T05:11:29Z</published><updated>2007-08-15T05:11:29Z</updated><content type="html">&lt;p&gt;Hello, I (finally) got around to uploading the &lt;a href="http://footheory.com/files/folders/csharpandlinq/entry160.aspx" target="_blank"&gt;code&lt;/a&gt; for &lt;a href="http://footheory.com/blogs/bennie/archive/2007/08/11/new-features-in-c-3-0-part-5-lambda-expressions.aspx" target="_blank"&gt;part 5 of my C# 3.0 article&lt;/a&gt; series. I also finalized the text of the post, adding a section on extension methods and lambda functions at the end of the article. &lt;/p&gt; &lt;p&gt;If you read the article, you will notice my excitement around lambda expression, I think they really move C# ahead with leaps and bounds, and open up the possibilities of endless language extensions, especially combined with expression trees, which is curiously enough the topic of of my next post!&lt;/p&gt; &lt;p&gt;Stay&amp;nbsp; tuned!&lt;/p&gt;&lt;img src="http://footheory.com/aggbug.aspx?PostID=161" width="1" height="1"&gt;</content><author><name>bennie</name><uri>http://footheory.com/members/bennie.aspx</uri></author></entry><entry><title>New Features in C# 3.0, Part 5: Lambda Expressions</title><link rel="alternate" type="text/html" href="http://footheory.com/blogs/bennie/archive/2007/08/11/new-features-in-c-3-0-part-5-lambda-expressions.aspx" /><id>http://footheory.com/blogs/bennie/archive/2007/08/11/new-features-in-c-3-0-part-5-lambda-expressions.aspx</id><published>2007-08-11T21:29:57Z</published><updated>2007-08-11T21:29:57Z</updated><content type="html">&lt;h3&gt;Definition&lt;/h3&gt; &lt;p&gt;A Lambda Expression is basically a logic evolution of the concept of anonymous functions, which was introduced with C# 2.0. Anonymous functions basically allow the body of a function to be written&amp;nbsp;"in-line", where we would normally expect a delegate to be invoked.&lt;/p&gt; &lt;p&gt;Lambda expressions provide a much more concise, functional and targeted syntax for writing anonymous methods. In LINQ they are used all the time. A LINQ query is basically a tree of Lambda expressions. We will look at expressions trees in detail in the next post&amp;nbsp;in this series.&lt;/p&gt; &lt;p&gt;Lambda expressions provide a very compact and type-safe way to write functions that can be passed as function arguments to another function for subsequent evaluation.&lt;/p&gt; &lt;h3&gt;A Bit of history&lt;/h3&gt; &lt;p&gt;In this section, we will look at the evolution in C# from delegates, to anonymous methods and finally to Lambda expressions. The code for this section can be found in the "&lt;font face="Courier New" size="2"&gt;SimpleExamples&lt;/font&gt;" project of the &lt;a href="http://footheory.com/files/folders/csharpandlinq/entry160.aspx" target="_blank"&gt;download code&lt;/a&gt;&amp;nbsp;for this article.&lt;/p&gt; &lt;p&gt;In this "history" section, we will take a simple problem, which in this case is the indirect execution of a block&amp;nbsp; of code, and solve it using different methods:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Delegates  &lt;li&gt;Anonymous Methods  &lt;li&gt;Lambda Expressions&lt;/li&gt;&lt;/ul&gt; &lt;h4&gt;Delegates&lt;/h4&gt; &lt;p&gt;Since it inception C# and .NET 1.0 have supported the concept of a &lt;em&gt;delegate&lt;/em&gt;. A &lt;em&gt;delegate&lt;/em&gt; is basically a type-safe function pointer. Delegates specify a method to call and optionally an object to call the method on. Typically, delegate are used&amp;nbsp;to implement callbacks and event listeners.&lt;/p&gt; &lt;p&gt;A simple example of a class that uses a delegate is shown below (this class is part of the code project mentioned earlier):&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:e753a5d0-4c5c-4141-8dbb-6bbd81c26961" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#DFDFDF;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This class invokes a method through a delegate
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; ClassWithDelegate
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; This is our delegate declaration&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;delegate&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; MyDelegate(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; myInt, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; myString);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; This is the method which will invoke &amp;quot;Bar&amp;quot; through a delegate&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; InvokeMethodThroughDelegate()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;            MyDelegate myDelegate &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; MyDelegate(Bar);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;            myDelegate(&lt;/span&gt;&lt;span style="color:#000000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;test&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Bar(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; anInt, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; aString)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\tThis is a method invoked through a delegate, params: {0} and {1}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;                anInt, aString);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;    } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; class ClassWithDelegate&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;First, on line 7&amp;nbsp;we have our delegate declaration, which basically specifies the name of our delegate and the signature of the to-be invoked method. The method we want to invoke is &lt;font face="Courier New" size="2"&gt;Bar&lt;/font&gt;, the body of which is specified from line 16 through line 20 in the code.&lt;/p&gt;
&lt;p&gt;In line 12, notice how we have to "new up" a new instance of our delegate, specifying the name of the method (&lt;font face="Courier New" size="2"&gt;Bar&lt;/font&gt;) as an argument. In the next line, we can then call the method through the delegate, passing in the function arguments.&lt;/p&gt;
&lt;p&gt;Note that delegates are type safe, so if at line 12, I specified a method (say &lt;font face="Courier New" size="2"&gt;Foo&lt;/font&gt;) as the &lt;font face="Courier New" size="2"&gt;new&lt;/font&gt; argument,&amp;nbsp;with a signature that did not match&amp;nbsp;the signature specified by the&amp;nbsp; &lt;font face="Courier New" size="2"&gt;MyDelegate&lt;/font&gt; specification,&amp;nbsp;I would have received a compiler error:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:0f44c15b-2dc6-409c-a3b2-acc1f27f42bd" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#FFA8A8;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Error    &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;    No overload &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;Foo&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt; matches &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;delegate&lt;/span&gt;&lt;span style="color:#000000;"&gt;     SimpleExamples
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;While delegates definitely have their use, and will continue to serve us well in the future, in the above example the code is pretty verbose. Basically, all we want to do is execute a block of code, but I need my delegate declaration, my Bar method, I need to new up a Delegate instance before I finally can invoked the code through the delegate. Isn't there a better way? Yes, there is.. enter: "Anonymous Methods"!&lt;/p&gt;
&lt;h4&gt;Anonymous Methods&lt;/h4&gt;
&lt;p&gt;An anonymous method is&amp;nbsp;a new feature in C# 2.0 that lets you define an anonymous (that is, nameless) method that can be called by a delegate. Just like a regular method, a anonymous method can take any number of parameters. An anonymous method is defined inline, and not as a member of any class.&lt;/p&gt;
&lt;p&gt;Anonymous methods can be used anywhere that a delegate is expected.&amp;nbsp; You can pass an anonymous method into any method that accepts the appropriate delegate type as a parameter.&lt;/p&gt;
&lt;p&gt;Going back to our example, here is the code for the "&lt;font face="Courier New" size="2"&gt;ClassWithAnonMethod&lt;/font&gt;" class with our sample project:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:99df7c83-4423-4083-9ab4-614996a6ff9e" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#DFDFDF;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; ClassWithAnonMethod
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; This is the delegate declaration&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;delegate&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; MyDelegate(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; myInt, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; myString);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; This is the method which will calls an anonymous method
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; through a delegate&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; InvokeMethodThroughAnonMethod()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            MyDelegate myDelegate &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;delegate&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; anInt, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; aString)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;                Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\tThis is the anonymous method, params: {0} and {1}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    anInt, aString);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;            };
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;            myDelegate(&lt;/span&gt;&lt;span style="color:#000000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;test&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;    } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; class ClassWithAnonMethod
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;As you can see, our delegate declaration is still there, but our "&lt;font face="Courier New" size="2"&gt;Bar&lt;/font&gt;" method has now been replaced with an anonymous method, defined in lines 12 and 13. The anonymous method itself is still invoked through the delegate in the same way at line 16. This code is a lot more compact and easier to read in some situations (as long as the code in the anonymous method is limited to a couple of lines of code). &lt;/p&gt;
&lt;h5&gt;A Zen moment...&lt;/h5&gt;
&lt;p&gt;My last comment (about anonymous functions) again makes me think that it would be a good idea to write a closure post at the end of this series, where we do&amp;nbsp;kind of&amp;nbsp;a "reset", and look at where it would be appropriate to use each feature mentioned in&amp;nbsp;this series. In the programming world, you basically have two types of people (I am over-simplifying here, I know):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The first type are the folks who love all of this "new stuff", and would go out of their way to use every feature possible. 
&lt;li&gt;The second&amp;nbsp;group of folks&amp;nbsp;just wants to get&amp;nbsp; the job done.&amp;nbsp;From these folks&amp;nbsp;you often hear comments like: 'this is very cool stuff, but it just need to get this project done, and this stuff is not going to help me get there any faster!"&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;I think both groups of people have a point, and the "sweet spot" is probably somewhere in between both opinions. I don't see myself driving to work every day, thinking: "Today I am going to write a killer lamba expression tree, and create a cool new query syntax" ;-), but I can see a use for each of the features we talk about so far, &lt;em&gt;as long as it is applied in the right context&lt;/em&gt;. And of course, when it comes to LINQ, DLINQ and XLINQ itself, I think those feature will indeed change the way we work, and they will be incredible time savers indeed!&lt;/p&gt;
&lt;p&gt;Ok, that was my short "Zen moment", sorry for the interruption,&amp;nbsp;back to Lambda expressions" now!&lt;/p&gt;
&lt;h4&gt;Lambda Expressions&lt;/h4&gt;
&lt;p&gt;Lambda expression provide a more concise, functional syntax for writing an anonymous method.&amp;nbsp;Compared to anonymous methods they provide a very compact and more type-safe way to write small functions that can be passed as arguments for subsequent evaluation. The Select, Where, Sort etc. clauses in LINQ are basically all written as Lambda expressions.&lt;/p&gt;
&lt;p&gt;Below is a small code sample. This is the "&lt;font face="Courier New" size="2"&gt;ClassWithLambda&lt;/font&gt;" class from out sample project:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:5e14250f-17e3-44e7-9a75-64a472aefde0" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#EBEBEB;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; ClassWithLambda
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; This is the delegate declaration&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;delegate&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; MyDelegate(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; myInt, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; myString);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; InvokeMethodWithLambdaBLOCKED EXPRESSION
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Now our delegate uses a Lambda expression&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            MyDelegate myDelegate &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;                (value1, value2) &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Console.WriteLine(
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\tThis is lambda expression, params: {0} and {1}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, value1, value2);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;            
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;            myDelegate(&lt;/span&gt;&lt;span style="color:#000000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;test&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Note that we still have our Delegate declaration at line 4. The Lambda expression itself is on lines 10 and 11. &lt;/p&gt;
&lt;p&gt;In C# 3.0 a lambda expression is syntactically written as a parameter list, followed by a =&amp;gt;token, and then followed by the expression or statement block to execute when the expression is invoked. In it simplest form, a lambda expression can look like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;params =&amp;gt; expression&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;You can omit the parenthesis around the parameters when you only have one parameter.&lt;/p&gt;
&lt;p&gt;In our case, our lambda expression looks like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;(value1, value2) =&amp;gt; Console.WriteLine(....)&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Note that I did not bother to specify the types of both value1 and value2. Now, there is nothing that prohibits me from doing so, so I could have written:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;(int value1, string value2) =&amp;gt; Console.WriteLine(....)&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In the first example, the compiler will use type inference to&amp;nbsp; find out what the types of passed-in parameters are, so the run-time overhead for both types will be exactly the same.&lt;/p&gt;
&lt;p&gt;The expression you write at the right side of the =&amp;gt; token can be any expression or statement block, and it can consume the passed-in parameters.&lt;/p&gt;
&lt;p&gt;Now, you might look at this and say "big deal", now what does&amp;nbsp; this offer me that I cannot do with anonymous method? Well, let's take a look at that in the next section!&lt;/p&gt;
&lt;h3&gt;Using Lambda Expressions as Parameters to Functions&lt;/h3&gt;
&lt;p&gt;This this section, we will look at one of the most powerful features of lambda expressions, which is its ability to be passed as parameters to functions in a type-safe way with automatic type inference.&amp;nbsp;During this section, we are assuming that we are creating a Math Library, and we are going to pass in a function that performs the actual math operation as a lambda expression. We will start out simple, and add more powerful features as we go along.&lt;/p&gt;
&lt;h4&gt;Using hard-coded argument types&lt;/h4&gt;
&lt;h6&gt;&lt;/h6&gt;
&lt;p&gt;Below is our first example:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:cd431ca8-737b-4068-9471-bf866055c33a" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E6E6E6;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;  This function takes a lambda as parameter with hard-coded
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;  types for the parameters (in this case all integers)&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; PerformMathFunction(Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; lambdaExpression, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; val1, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; val2)
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; result &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; lambdaExpression(val1, val2);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\tPerformMathFunction, val1: {0}, val2: {1}, result: {2}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;                val1, val2, result);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; result;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;the parameter:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;Func&amp;lt;int, int, int&amp;gt; lambdaExpression&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;specifies that we are passing in a lambda expression, which takes two integers (the first two parameters are &lt;font face="Courier New" size="2"&gt;integers&lt;/font&gt;), and returns an &lt;font face="Courier New" size="2"&gt;integer&lt;/font&gt;. In a &lt;font face="Courier New" size="2"&gt;Func&lt;/font&gt; specification like this, the last type is always the return type. So far example an expression like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;Func&amp;lt;int, double&amp;gt; lambdaExpression&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;specifies that we are passing in a lambda expression that takes one parameter&amp;nbsp;that is an integer, and returns a double, or even simpler:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;Func&amp;lt;decimal&amp;gt; lambdaExpression&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;font face="couri" size="2"&gt;specifies that we are passing in a lambda expression that returns a double.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;We are invoking the passed-in lambda expression as follows:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;int result = lambdaExpression(val1, val2);&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In this case we know that our lambda expression is returning an integer, so we can assign the result of our expression to an integer. The rest of the above method simply prints our the passed-in values and the result, and returns the result.&lt;/p&gt;
&lt;p&gt;Below is an example of how you invoke the &lt;font face="Courier New" size="2"&gt;PerformMathFunction()&lt;/font&gt; method:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:cbd18925-b653-4078-a11d-2ea2adfc471c" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E5E5E5;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; In the remainder of this method, we show how you can pass lamda
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; expressions as arguments to a method &lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;3&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            ClassWithLambdaExpressionAsParam paramClass &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;4&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; ClassWithLambdaExpressionAsParam();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;5&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;6&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Simple examples without type inference&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;7&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            paramClass.PerformMathFunction((&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; val1, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; val2) &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; val1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; val2, &lt;/span&gt;&lt;span style="color:#000000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;20&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;8&lt;/span&gt; &lt;span style="color:#000000;"&gt;            paramClass.PerformMathFunction((&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; val1, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; val2) &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; val1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt; val2, &lt;/span&gt;&lt;span style="color:#000000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;20&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The lambda expressions that we pass in are:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;(int val1, int val2) =&amp;gt; val1 + val2&amp;nbsp;&amp;nbsp;&amp;nbsp; -and-&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;(int val1, int val2) =&amp;gt; val1&amp;nbsp;* val2&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The above example produces the following output:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:5df0f762-1d09-47be-a52b-a5aaf6e7a29c" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#DDDDDD;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;PerformMathFunction, val1: &lt;/span&gt;&lt;span style="color:#000000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;, val2: &lt;/span&gt;&lt;span style="color:#000000;"&gt;20&lt;/span&gt;&lt;span style="color:#000000;"&gt;, result: &lt;/span&gt;&lt;span style="color:#000000;"&gt;30&lt;/span&gt;&lt;span style="color:#000000;"&gt;
PerformMathFunction, val1: &lt;/span&gt;&lt;span style="color:#000000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;, val2: &lt;/span&gt;&lt;span style="color:#000000;"&gt;20&lt;/span&gt;&lt;span style="color:#000000;"&gt;, result: &lt;/span&gt;&lt;span style="color:#000000;"&gt;200&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;While the above example nicely illustrates how we can pass in a lambda expressions into a method, it has one main drawback: It only works with arguments of type Integer. In the next example, we will see how we can get around this.&lt;/p&gt;
&lt;h4&gt;Using Generic arguments Types&lt;/h4&gt;
&lt;p&gt;Below is a new version of our method:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:2e476f64-e2dc-47b6-ad40-2ed3aad336ae" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E2E2E2;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;  This function uses Type Inference (&amp;quot;T&amp;quot;), but forces all parameters to be of the
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;  same type, so both math parameters and the return type are of the same Type T&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; T PerformMathFunctionWithTypeInference&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T, T, T&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; lambdaExpression, T val1, T val2)
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;            T result &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; lambdaExpression(val1, val2);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\tPerformMathFunctionWithTypeInference, val1: {0}, val2: {1}, result: {2}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;                val1, val2, result);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\t\tType of T: {0}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(T).Name);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; result;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Now, our passed-in lambda expression has changed to:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;Func&amp;lt;T, T, T&amp;gt; lambdaExpression&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Now, we are using a generically typed parameter, and the compiler will use type interference to determine what the type of T is. Note that we used the same type "&lt;font face="Courier New" size="2"&gt;T&lt;/font&gt;" everywhere, so we expect both input arguments and the return type to be of the same type. Compared to our previous example, our method has become a lot more flexible though, since we now can pass in an argument of any type, and the compiler will do the work of figuring out what the type is. &lt;/p&gt;
&lt;p&gt;Note also that since our Method &lt;font face="Courier New" size="2"&gt;PerformMathFunctionWithTypeInference()&lt;/font&gt; now basically is a generic method, we need to specify the generic parameter &lt;font face="Courier New" size="2"&gt;&amp;lt;T&amp;gt;&lt;/font&gt; as part of its name:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;public T PerformMathFunctionWithTypeInference&amp;lt;T&amp;gt;(...)&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Note that our method also prints out the name of the type "&lt;font face="Courier New" size="2"&gt;T&lt;/font&gt;", so in our output, we will be able to verify that the compiler indeed inferred the correct type.&lt;/p&gt;
&lt;p&gt;So, if we call this method as follows:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:9579c5a0-a9cb-40e1-94ac-a76ae5604724" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E2E2E2;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; In the remainder of this method, we show how you can pass lamda
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; expressions as arguments to a method &lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;3&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            ClassWithLambdaExpressionAsParam paramClass &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;4&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; ClassWithLambdaExpressionAsParam();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;5&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;6&lt;/span&gt; &lt;span style="color:#000000;"&gt;           &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Advanced examples with type inference&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;7&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            paramClass.PerformMathFunctionWithTypeInference((val1, val2) &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; val1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt; val2, &lt;/span&gt;&lt;span style="color:#000000;"&gt;200.0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;5.0&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Our output will look as follows:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:b5c55657-1052-44e2-8d62-37329dff5f32" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;width:744px;padding-top:0px;"&gt;&lt;pre style="background-color:#E1E1E1;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt; PerformMathFunctionWithTypeInference&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; val1: &lt;/span&gt;&lt;span style="color:#000000;"&gt;200&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; val2: &lt;/span&gt;&lt;span style="color:#000000;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; result: &lt;/span&gt;&lt;span style="color:#000000;"&gt;40&lt;/span&gt;&lt;span style="color:#000000;"&gt;
         &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Type&lt;/span&gt;&lt;span style="color:#000000;"&gt; of T: Double&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Because we passed in variables &lt;font face="Courier New" size="2"&gt;200.0&lt;/font&gt; and &lt;font face="Courier New" size="2"&gt;5.0&lt;/font&gt;, the compiler correctly inferred that the type of &lt;font face="Courier New" size="2"&gt;T &lt;/font&gt;is indeed &lt;font face="Courier New" size="2"&gt;Double&lt;/font&gt;. &lt;/p&gt;
&lt;p&gt;In our next example, we will take this example one step further, and vary the output type of the result.&lt;/p&gt;
&lt;h4&gt;Using different Generic types for the Arguments&lt;/h4&gt;
&lt;p&gt;As a next step, we will extend our example once more, and allow the return type of our lambda function to be different then the type of the passed-in parameters.&amp;nbsp; The code for the example is shown below:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:e3c2521e-b744-46db-9fa0-5ba788f5e78a" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E4E4E4;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; This function also takes a lambda parameters, but it allows the caller to specify a
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; different type for the return type of the lambda (type &amp;quot;R&amp;quot;). Both parameters are expected
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; to be of the same type &amp;quot;T&amp;quot;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; R PerformMathFunctionGenericFlexReturnType&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;R, T&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T, T, R&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; lambdaExpression, T val1, T val2)
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;            R result &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; lambdaExpression(val1, val2);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\tPerformMathFunctionGenericFlexReturnType, val1: {0}, val2: {1}, result: {2}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;                val1, val2, result);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\t\tType of T: {0}, Type of R: {1}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(T).Name, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(R).Name);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; result;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Notice the signature of our lambda expression:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;Func&amp;lt;T, T, R&amp;gt; lambdaExpression&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Indicating that the return type of our lambda expression is now the generic type "&lt;font face="Courier New" size="2"&gt;R&lt;/font&gt;", while the input parameters have the generic type "&lt;font face="Courier New" size="2"&gt;T&lt;/font&gt;". Notice also how we had to add the additional generic type parameter to our function signature:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;public R PerformMathFunctionGenericFlexReturnType&amp;lt;R, T&amp;gt;(....)&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In our function, we can now&amp;nbsp; use the return type "&lt;font face="Courier New" size="2"&gt;R&lt;/font&gt;" as the return type of the lambda expression. In this case, we also selected to print out both the name of the types of "&lt;font face="Courier New" size="2"&gt;T&lt;/font&gt;" and "&lt;font face="Courier New" size="2"&gt;R&lt;/font&gt;". An example invocation method is shown below:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:39b08b69-b827-434b-8865-f6703556976e" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E5E5E5;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; In the remainder of this method, we show how you can pass lamda
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; expressions as arguments to a method &lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;3&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            ClassWithLambdaExpressionAsParam paramClass &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;4&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; ClassWithLambdaExpressionAsParam();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;5&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;6&lt;/span&gt; &lt;span style="color:#000000;"&gt;           paramClass.PerformMathFunctionGenericFlexReturnType((val1, val2) &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;)(val1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt; val2), &lt;/span&gt;&lt;span style="color:#000000;"&gt;5.0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;2.0&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;So, our lambda expression is in this case:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;(val1, val2) =&amp;gt; (int)(val1 / val2)&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;When we run this sample, we get the following output:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:ac2b0c93-2654-45b1-8283-c652b265272f" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#EAEAEA;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;PerformMathFunctionGenericFlexReturnType&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; val1: &lt;/span&gt;&lt;span style="color:#000000;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; val2: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; result: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Type&lt;/span&gt;&lt;span style="color:#000000;"&gt; of T: Double&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Type&lt;/span&gt;&lt;span style="color:#000000;"&gt; of R: Int32&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Because our passed-in lambda expression did a cast of the result to integer, the compiler correctly inferred that the type of "R" is indeed &lt;font face="Courier New" size="2"&gt;System.Int32&lt;/font&gt;.&lt;/p&gt;
&lt;h3&gt;Lambda Expressions and Extension Methods&lt;/h3&gt;
&lt;h4&gt;Introduction&lt;/h4&gt;
&lt;p&gt;We talked about extension methods in &lt;a href="http://footheory.com/blogs/bennie/archive/2007/08/05/new-features-in-c-3-0-part-4-extension-methods.aspx" target="_blank"&gt;part 4&lt;/a&gt; of this series. Extension methods can basically be defined for any type, and long as the type itself is not static. We you combine Lambda expressions with extension methods, you get a very powerful brew. It is fact this combination that is at the very core of the query syntax of LINQ.&lt;/p&gt;
&lt;p&gt;Microsoft has create a large number of extension methods for the &lt;font face="Courier New" size="2"&gt;IEnumberable&amp;lt;T&amp;gt;&lt;/font&gt; type. &lt;font face="Courier New" size="2"&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/font&gt; is a logical choice since this interface is supported by most generics collections in C#. All of these extensions are defined&amp;nbsp; in the namespace &lt;font face="Courier New" size="2"&gt;System.Linq&lt;/font&gt;, in the static class&lt;font face="Courier New"&gt; &lt;font size="2"&gt;Enumerable&lt;/font&gt;&lt;/font&gt;:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:dd13b790-3c43-47ae-a302-4bb94fd99e5d" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E5E5E5;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Collections;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Collections.Generic;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Runtime.CompilerServices;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Linq
{
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Summary:
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     Provides a set of static (Shared in Visual Basic) methods for querying objects
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     that implement System.Collections.Generic.IEnumerable&amp;lt;T&amp;gt;.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Enumerable
    {
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Summary:
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     Applies an accumulator function over a sequence.
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Parameters:
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;   source:
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     An System.Collections.Generic.IEnumerable&amp;lt;T&amp;gt; to aggregate over.
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Parameters:
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;   func:
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     An accumulator function to be invoked on each element.
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Type parameters:
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;   TSource:
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     The type of the elements of source.
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Returns:
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     The final accumulator value.
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Exceptions:
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;   System.ArgumentNullException:
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     source or func is null.
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;   System.InvalidOperationException:
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     source contains no elements.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; TSource Aggregate&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TSource&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt; IEnumerable&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TSource&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; source, Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TSource, TSource, TSource&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; func);
        ......
       }
}
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, I wanted to find out how many extensions methods there were exactly, and give the reader some idea of how many different overloads there were for every method, but instead of doing this manual, I decided to write a little LINQ query (you know I had to&amp;nbsp; ;-)!. This is the code:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:68a3fffc-c2d3-4f1a-83f7-7cb1d8520a9c" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E5E5E5;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; DetermineNumberOfExtensionMethodsForIEnumerable()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Write the total number of methods&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            Console.WriteLine(
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Total number of methods in System.Linq.Enumerable: {0}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(System.Linq.Enumerable).GetMethods().Length);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; This query gets the name and number of overloaded methods&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            var overloads &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;                from method &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(System.Linq.Enumerable).GetMethods()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;where&lt;/span&gt;&lt;span style="color:#000000;"&gt; method.IsStatic &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;                group method by method.Name into m
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;                orderby m.Key
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;                select &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;                {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    MethodName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; m.Key,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    OverloadCount &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; m.Count()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;                };
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(Environment.NewLine);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Write out the overloads&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt; (var overload &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; overloads)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#000000;"&gt;                Console.WriteLine(
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Format(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Method: '{0}', # of overloads: {1}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    overload.MethodName, overload.OverloadCount));
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method DetermineNumberOfExtensionMethodsForIEnumerable
&lt;/span&gt;&lt;span style="color:#008080;"&gt;31&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I will no go over the detailed syntax here, since we have not talked about expression trees yet, but basically first this method uses good old reflection to get the total number of methods, and next, its uses a very simply LINQ query to group the methods in &lt;font face="Courier New" size="2"&gt;System.Linq.Enumerable&lt;/font&gt; by method name, and selects the results in an anonymous type which contains two properties:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The method name 
&lt;li&gt;The number of overloads&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;It uses a simple &lt;font face="Courier New" size="2"&gt;group by&lt;/font&gt; and&lt;font face="Courier New" size="2"&gt; order by&lt;/font&gt; to group and sort the results. Look like good old fashioned SQL doesn't it?&lt;/p&gt;
&lt;p&gt;Here are the result of the above method:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:60e617e0-fa6c-4901-9e07-2e1e1d86335a" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E4E4E4;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Total number of methods in System&lt;/span&gt;&lt;span style="color:#000000;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;Linq&lt;/span&gt;&lt;span style="color:#000000;"&gt;.&lt;/span&gt;&lt;span style="color:#000000;"&gt;Enumerable: &lt;/span&gt;&lt;span style="color:#000000;"&gt;178&lt;/span&gt;&lt;span style="color:#000000;"&gt;


Method: 'Aggregate'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'All'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Any'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'AsEnumerable'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Average'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;20&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Cast'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Concat'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Contains'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Count'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'DefaultIfEmpty'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Distinct'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'ElementAt'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'ElementAtOrDefault'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Empty'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Except'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'First'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'FirstOrDefault'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'GroupBy'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;8&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'GroupJoin'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Intersect'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: '&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Join&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Last'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'LastOrDefault'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'LongCount'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Max'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;22&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Min'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;22&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'OfType'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'OrderBy'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'OrderByDescending'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Range'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Repeat'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Reverse'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: '&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Select&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'SelectMany'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;4&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'SequenceEqual'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Single'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'SingleOrDefault'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Skip'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'SkipWhile'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Sum'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;20&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Take'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'TakeWhile'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'ThenBy'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'ThenByDescending'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'ToArray'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'ToDictionary'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;4&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'ToList'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'ToLookup'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;4&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Union'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
Method: 'Where'&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt; of overloads: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;When you study this list carefully, you recognize a large number of SQL constructs, such as &lt;font face="Courier New" size="2"&gt;Union, Where, Join, Intersect, OrderBy&lt;/font&gt; etc..&lt;/p&gt;
&lt;h4&gt;Manually Invoking Extension Methods with Lambda Expressions&lt;/h4&gt;
&lt;h5&gt;Using Type Inference&lt;/h5&gt;
&lt;h5&gt;&lt;/h5&gt;
&lt;p&gt;In the previous example, we jumped ahead a bit, directly to "pure" LINQ query syntax. Sorry about that, I just wanted to make sure that you guys stayed awake reading this article;-) In this section, we will take the LINQ query from the previous section, and play the role of compiler by manually writing the statement that the compiler generates for us when executing the query. Note that this will be an "unofficial" translation. The "real" translation is done with expression trees, which we will take a look at in our next post.&lt;/p&gt;
&lt;p&gt;Let's summarize first what we need to do:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We need to get an array of all the methods in System.Linq.Enumerable.&lt;/li&gt;
&lt;li&gt;Next, we filter this list by only including the static methods&lt;/li&gt;
&lt;li&gt;Then, we order this group by Method Name&lt;/li&gt;
&lt;li&gt;Next, we need to group the result of step 2 by Method Name&lt;/li&gt;
&lt;li&gt;Finally, we loop over each tuple in the group, and print out the method name, and the count of methods, which is basically the number of overloads for the method.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Ok, that does not look difficult at all, so let's get to work. Below is the code for the first version of this implementation:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:073f2e7c-c134-46ec-99ca-0850c5353713" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E4E4E4;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ExampleUsingTypeInference()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\nNo query, strongly typed variables&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; Environment.NewLine);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; First, get all methods in the class&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            var methods &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(System.Linq.Enumerable).GetMethods();
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Total number of methods in System.Linq.Enumerable: {0}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    methods.Length);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Now, get the static methods&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            var staticMethods &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;                methods.Where(m &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; m.IsStatic &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Now, order by name&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            var orderedStaticMethods &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;                staticMethods.OrderBy(m &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; m.Name);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Next, group by name&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            var methodGroups &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; orderedStaticMethods.GroupBy(m &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; m.Name);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Iterate over each group, print out the key (which is the Method Name, and the count of 
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; methods in the Group&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt; (var methodGroup &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; methodGroups)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;                Console.WriteLine(
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Format(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Method: '{0}', # of overloads: {1}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    methodGroup.Key, methodGroup.Count()));
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method ExampleUsingTypeInference&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The first important fact that you probably notice is my heavy use of type inference. I use implicitly typed local variables pretty much all over the place, because at this point, I was not interested in the detailed data types returned by each of the extension methods. That's something we worry about in the next section..&lt;/p&gt;
&lt;p&gt;In line 6, we get the type of &lt;font face="Courier New" size="2"&gt;System.Linq.Enumerable&lt;/font&gt;, and use &lt;font face="Courier New" size="2"&gt;GetMethods()&lt;/font&gt; to get all of the methods of the type. This returns me an array of &lt;font face="Courier New" size="2"&gt;MethodInfo&lt;/font&gt;'s, but I don't really worry about that, so I use&amp;nbsp;a &lt;font face="Courier New" size="2"&gt;var&lt;/font&gt; for the result. It is important to know though that whatever the type is of methods, it will support the &lt;font face="Courier New" size="2"&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/font&gt; interface (this interface is supported by pretty much all array and generic collection types in .NET).&lt;/p&gt;
&lt;p&gt;Next, we use the Where extension method of &lt;font face="Courier New" size="2"&gt;IENumerable&amp;lt;T&amp;gt;&lt;/font&gt; to filter out just the static methods in lines 12 and 13.&amp;nbsp; The lambda expression that we pass in is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;&amp;nbsp;m =&amp;gt; m.IsStatic == true&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;When the compiler looks at this lambda expression, it will use type inference to infer the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Since &lt;font face="Courier New" size="2"&gt;GetMethods()&lt;/font&gt; returned an array of &lt;font face="Courier New" size="2"&gt;MethodInfo&lt;/font&gt;'s, m must be of type &lt;font face="Courier New"&gt;MethodInfo&lt;/font&gt;.&lt;/li&gt;
&lt;li&gt;The expression body of our lambda expression returns a boolean, since we have a boolean expression&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Again, we don't care about the return type of this method, so we use the implicitly typed local variable &lt;font face="Courier New" size="2"&gt;staticMethods&lt;/font&gt; to store the result.&lt;/p&gt;
&lt;p&gt;Next, we need to order by name, another &lt;font face="Courier New" size="2"&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/font&gt; extension method &lt;font face="Courier New" size="2"&gt;OrderBy&lt;/font&gt; can do this for us. The lambda expression we pass in in lines 16 and 17&amp;nbsp; specifies the Name of the method, so we&amp;nbsp; are indeed sorting by method name.&lt;/p&gt;
&lt;p&gt;In line 20 we use the &lt;font face="Courier New" size="2"&gt;GroupBy IEnumerable&amp;lt;T&amp;gt;&lt;/font&gt; extension method to sort the methods by name. Again, we assign this to a &lt;font face="Courier New" size="2"&gt;var (methodGroups).&lt;/font&gt; In a group, the identifier of the group can be accessed by the &lt;font face="Courier New" size="2"&gt;Key&lt;/font&gt; property (which is our case is the method name, because we grouped by method name). We can also apply aggregate functions to a group, in our case we use the &lt;font face="Courier New" size="2"&gt;Count()&lt;/font&gt; method in line 28 to get the count of the methods (i.e. "overloads") in each group.&lt;/p&gt;
&lt;p&gt;When you run this code, you will get exactly the same result as the result you got with the LINQ query, which proves that our analysis process was correct. This also shows us that nothing "magical" is going on. The only real processing here was the invocation of &lt;font face="Courier New" size="2"&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/font&gt; extension methods with very simple lambda expressions.&lt;/p&gt;
&lt;h5&gt;Using Explicit Types&lt;/h5&gt;
&lt;p&gt;Just to show how type inference makes our lives easy, I have taken the above example, but this time, I have used the "real" types returned from the extension methods, instead of relying on type inference. Below is the code:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:d54a24ba-ccc9-4367-a1ce-c87b38f6346f" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E4E4E4;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ExampleUsingStrongTyping()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\nNo query, strongly typed variables&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; Environment.NewLine);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; First, get all methods in the class&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            System.Reflection.MethodInfo[] methods &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color:#000000;"&gt;(System.Linq.Enumerable).GetMethods();
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Total number of methods in System.Linq.Enumerable: {0}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    methods.Length);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Now, get the static methods&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            IEnumerable&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;System.Reflection.MethodInfo&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; staticMethods &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;                methods.Where(m &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; m.IsStatic &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Now, order by name&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            IOrderedEnumerable&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;System.Reflection.MethodInfo&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; orderedStaticMethods &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;                staticMethods.OrderBy(m &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; m.Name);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Next, group by name&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            IEnumerable&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;IGrouping&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;, System.Reflection.MethodInfo&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; methodGroups &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;                orderedStaticMethods.GroupBy(m &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; m.Name);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Iterate over each group, print out the key (which is the Method Name, and the count of 
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; methods in the Group&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt; (IGrouping&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;, System.Reflection.MethodInfo&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; methodGroup &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; methodGroups)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;                Console.WriteLine(
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Format(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Method: '{0}', # of overloads: {1}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    methodGroup.Key, methodGroup.Count()));
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;31&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method ExampleUsingStrongTyping&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As you can see, no more var's in the above code. Although the code is a bit more complex, the types used make sense, and are really nothing new. The only interface that is really new to us is the &lt;font face="Courier New" size="2"&gt;IGrouping&lt;/font&gt; interface, which represents a query grouping:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f1475c7a-4a3f-4a24-983e-04e9f4ce812d" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#DFDFDF;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Linq
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Summary:
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     Represents a collection of objects that have a common key.
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Type parameters:
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;   TKey:
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     The type of the key of the System.Linq.IGrouping&amp;lt;TKey,TElement&amp;gt;.
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Type parameters:
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;   TElement:
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     The type of the values in the System.Linq.IGrouping&amp;lt;TKey,TElement&amp;gt;.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;interface&lt;/span&gt;&lt;span style="color:#000000;"&gt; IGrouping&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TKey, TElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; : IEnumerable&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, IEnumerable
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Summary:
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     Gets the key of the System.Linq.IGrouping&amp;lt;TKey,TElement&amp;gt;.
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Returns:
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;     The key of the System.Linq.IGrouping&amp;lt;TKey,TElement&amp;gt;.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        TKey Key { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;From the above interface definition, you notice the read-only &lt;font face="Courier New" size="2"&gt;Key&lt;/font&gt; attribute, which represents the identifier of the grouping. Also, a number of overloads in &lt;font face="Courier New" size="2"&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/font&gt; take &lt;font face="Courier New"&gt;IGrouping&lt;/font&gt; arguments, and allow you to apply aggregate functions to then, such as&lt;font face="Courier New" size="2"&gt; Count(), Sum(), Avg() &lt;/font&gt;etc.. which comes in very handy in a number of common queries.&lt;/p&gt;
&lt;h3&gt;Passing Lambda Expressions to Custom Extension Methods&lt;/h3&gt;
&lt;p&gt;When you write your own extension methods, your methods can also take lambda expressions to enhance the flexibility of the method. Below is a very simple &lt;font face="Courier New" size="2"&gt;System.String&lt;/font&gt; extension method:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:c2b82fde-3915-49df-bd5a-2cbba3222713" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E0E0E0;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; ManipulateCharacterWithinString(
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt; String str, Func&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; manipulateFunc, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;char&lt;/span&gt;&lt;span style="color:#000000;"&gt; ch)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;3&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;4&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; subStr &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; manipulateFunc(ch);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;5&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; str.Replace(ch.ToString(), subStr);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;6&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;7&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method DuplicateCharacterWithString
&lt;/span&gt;&lt;span style="color:#008080;"&gt;8&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;This extension method is very simple.It takes a lambda expression called &lt;font face="Courier New" size="2"&gt;manipulateFunc&lt;/font&gt;, which can translate and character into a &lt;font face="Courier New" size="2"&gt;string&lt;/font&gt;. The extension method will then perform a replace in the source string from the original character to the string created by the Lambda expression.&lt;/p&gt;
&lt;p&gt;Below is an example of some invocations of this extension method:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:43a2966e-1cea-4fec-8968-74c2ef69ad41" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#D7D7D7;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\nString extension method taking a lambda expression&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; str &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;test&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; newStr &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;                str.ManipulateCharacterWithinString(
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    (charToManipulate) &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; charToManipulate.ToString() &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;                                          charToManipulate.ToString(), 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;e&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Old string: {0}, new String: {1}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, str, newStr);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; otherNewString &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;                str.ManipulateCharacterWithinString(
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;                    (charToManipulate) &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; charToManipulate.ToString() &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;e&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Old string: {0}, new String: {1}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, str, otherNewString);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The first lambda expression basically duplicates the passed-in character, while the second lambda expression extends the character with the "#" character.&lt;/p&gt;
&lt;p&gt;The above sample will produce the following output:&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:8e314cf1-25ab-43c9-8083-4367258bfe50" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E2E2E2;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;String extension method taking a lambda expression
Old string: test&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; new String: teest
Old string: test&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; new String: te&lt;/span&gt;&lt;span style="color:#000000;"&gt;#&lt;/span&gt;&lt;span style="color:#000000;"&gt;st&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;and, as you can see the correct substitutions were performed.&lt;/p&gt;
&lt;h3&gt;Wrap Up&lt;/h3&gt;
&lt;p&gt;Sorry about the length of this post. We had a lot to cover here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First, we compared a lambda expression to classic delegates and anonymous functions&lt;/li&gt;
&lt;li&gt;Next, we looked at how you can pass lambda expressions as function arguments, with or without type inference.&lt;/li&gt;
&lt;li&gt;Finally, we looked at the powerful combination of extension methods and lambda expression, and we saw how this forms the cornerstone of the LINQ query sub-system.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;In the next section, we take a look at expression trees, which is the mechanism that allows us to create a custom language syntax, such as the LINQ query syntax.&lt;/p&gt;
&lt;p&gt;I encourage you to download the corresponding &lt;a href="http://footheory.com/files/folders/csharpandlinq/entry160.aspx" target="_blank"&gt;sample code&lt;/a&gt;, and as always, feedback is very much appreciated.&lt;/p&gt;&lt;img src="http://footheory.com/aggbug.aspx?PostID=155" width="1" height="1"&gt;</content><author><name>bennie</name><uri>http://footheory.com/members/bennie.aspx</uri></author></entry><entry><title>New Features in C# 3.0. Part 4 : Extension Methods</title><link rel="alternate" type="text/html" href="http://footheory.com/blogs/bennie/archive/2007/08/05/new-features-in-c-3-0-part-4-extension-methods.aspx" /><id>http://footheory.com/blogs/bennie/archive/2007/08/05/new-features-in-c-3-0-part-4-extension-methods.aspx</id><published>2007-08-06T02:43:59Z</published><updated>2007-08-06T02:43:59Z</updated><content type="html">&lt;h3&gt;Definition&lt;/h3&gt; &lt;p&gt;An extension method is a method that you can use to extend the functionality of an existing type. This type can be an custom class that you have created, a standard BCL class such as &lt;font face="Courier New" size="2"&gt;System.String&lt;/font&gt;, or any interface, such as &lt;font face="Courier New" size="2"&gt;IEnumerable&lt;/font&gt;. Once you have created an extension method for the type, you can use the extension method&amp;nbsp;as if it was a standard method of that type. From a client programmer's point of view, the extension method and the standard method of the type are indistinguishable.&lt;/p&gt; &lt;p&gt;Note: the code for this article can be downloaded &lt;a href="http://footheory.com/files/folders/csharpandlinq/entry152.aspx" target="_blank"&gt;here&lt;/a&gt;. The download contains a&amp;nbsp;Orcas Beta 2 Solution.&amp;nbsp;Each section in this post will name the appropriate project within the solution that applies to the section.&lt;/p&gt; &lt;h3&gt;Steps to Create an Extension Method&lt;/h3&gt; &lt;p&gt;If you want to extend an existing type with an extension method, follow these steps:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Define a &lt;font face="Courier New" size="2"&gt;public static&lt;/font&gt; class.  &lt;li&gt;Define a &lt;font face="Courier New" size="2"&gt;public static&lt;/font&gt; method in this above class. The first method of this class should be the data type for which you want to define the extension method.  &lt;li&gt;Use the &lt;font face="Courier New" color="#400080" size="2"&gt;this&lt;/font&gt; keyword as the name of the first argument of the above method. The &lt;font face="Courier New" color="#400080" size="2"&gt;this&lt;/font&gt; keyword denotes the method&amp;nbsp;as an extension method.&lt;/li&gt;&lt;/ol&gt; &lt;h3&gt;Examples&lt;/h3&gt; &lt;h4&gt;Example 1: User-Created class&lt;/h4&gt; &lt;p&gt;Say you have written and deployed the following class:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f5e1b18a-1251-46fc-aae0-4d9c54124314" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E6E6E6;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; MyMathClass
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; Add(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; var1, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; var2)
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; var1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; var2;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; Subtract(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; var1, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; var2)
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; var1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt; var2;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;    } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; class MyMathClass&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;After the class has been successfully used in production, your customer asks you the add a &lt;font face="Courier New" size="2"&gt;Multiply&lt;/font&gt; method to your class. Since you do not want to re-deploy your entire application, you decide to write an extension method for the class, and deploy it in it's own assembly. Below is the code for the extension method:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:d54a91ff-c065-4df3-a815-d5c7676f1c91" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E8E8E8;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This is my Math Extensions class
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; MyMathExtensions
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; The first argument of a class extension should always be named &amp;quot;this&amp;quot;, and
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; should have the Type of the Type you want to extend (in this class MyMathClass)&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; Multiply(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt; MyMathClass math, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; var1, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; var2)
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; var1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt; var2;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method Multiply&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;    } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; class MyMathExtensions
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;As you can see, this method adheres to the rules defined for an extension method:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It is defined in a &lt;font face="Courier New" size="2"&gt;public, static&lt;/font&gt; class. 
&lt;li&gt;It is a &lt;font face="Courier New" size="2"&gt;static&lt;/font&gt; method 
&lt;li&gt;It's first argument is named &lt;font face="Courier New" size="2"&gt;this&lt;/font&gt;, and is of type &lt;font face="Courier New" size="2"&gt;MyMathClass&lt;/font&gt;, which is the type that we want to extend.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Below is a code sample that uses both the standard methods and the extension method, as you can see, the invocation method is the same for all 3 methods:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:617d8d54-fa66-41bb-b05e-f61c123d6924" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#EAEAEA;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Program
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Main(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] args)
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; The first example method uses the methods in the MyMath class&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            MyMathClass math &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; MyMathClass();
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;5 + 10 = {0}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, math.Add(&lt;/span&gt;&lt;span style="color:#000000;"&gt;5.0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;10.0&lt;/span&gt;&lt;span style="color:#000000;"&gt;));
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;10 - 2 = {0}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, math.Subtract(&lt;/span&gt;&lt;span style="color:#000000;"&gt;10.0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;2.0&lt;/span&gt;&lt;span style="color:#000000;"&gt;));
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; This line used the &amp;quot;Multiply&amp;quot; extension method&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;3 * 8 = {0}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, math.Multiply(&lt;/span&gt;&lt;span style="color:#000000;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;8&lt;/span&gt;&lt;span style="color:#000000;"&gt;));
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;        
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method Main&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; class Program&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The output is shown below:&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:89d01fdb-b1dd-4593-8529-28299a734f06" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#DFDFDF;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;15&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt; - &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;8&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt; * &lt;/span&gt;&lt;span style="color:#000000;"&gt;8&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;24&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;You can find the code for this example in the &lt;font face="Courier New" size="2"&gt;UserDefinedClass&lt;/font&gt; project of the &lt;a href="http://footheory.com/files/folders/csharpandlinq/entry152.aspx" target="_blank"&gt;download solution&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Example 2: Extending a BCL class&lt;/h4&gt;
&lt;p&gt;In this example, we will take the &lt;font face="Courier New" size="2"&gt;System.Collections.ArrayList&lt;/font&gt; class, and extend it in two ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;With the current API, a client can only insert a single value with the &lt;font face="Courier New" size="2"&gt;Insert&lt;/font&gt; method. We want to create an extension method which will overload the built-in &lt;font face="Courier New" size="2"&gt;Insert&lt;/font&gt; method to allow for the insertion of multiple values. 
&lt;li&gt;To view our results, we will also add a &lt;font face="Courier New" size="2"&gt;Print&lt;/font&gt; extension method to provide a clean printout of the values in our &lt;font face="Courier New" size="2"&gt;ArrayList &lt;/font&gt;instance.&lt;/li&gt;&lt;/ul&gt;
&lt;h5&gt;Overloading the Insert method&lt;/h5&gt;
&lt;p&gt;The standard prototype of the insert method for the &lt;font face="Courier New" size="2"&gt;ArrayList&lt;/font&gt; class looks as follows: &lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New" size="2"&gt;void ArrayList,Insert(int index, object value);&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;so, we can insert a single value, but we have no ability to add a whole list of values, which might be desirable (you have the AddRange method, but that only allows for the addition of values at the end of&amp;nbsp; the ArrayList). Our extension method looks as follows:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:1f92d866-c278-46b1-9e09-00ed252c4a38" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E5E5E5;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; This class contains our Array List Extensions&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; ArrayListExtensions
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This is our extension method for the Array class
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;param name=&amp;quot;array&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;param name=&amp;quot;startIndex&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;param name=&amp;quot;values&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Insert(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt; ArrayList array, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; startIndex, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;params&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] values)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; First, check the start index&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (startIndex &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; array.Count)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Add the values&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; obj &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; values)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;                array.Insert(startIndex&lt;/span&gt;&lt;span style="color:#000000;"&gt;++&lt;/span&gt;&lt;span style="color:#000000;"&gt;, obj);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method Insert&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;       ...
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }&lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; class ArrayListExtensions&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;So, this method uses the &lt;font face="Courier New" size="2"&gt;params&lt;/font&gt; keyword to allows for an arbitrary list of values to be inserted. The method verifies the validity of the &lt;font face="Courier New" size="2"&gt;startIndex&lt;/font&gt;, and then inserts each of the values, adjusting the &lt;font face="Courier New" size="2"&gt;startIndex&lt;/font&gt; after each insert. &lt;/p&gt;
&lt;p&gt;The important fact to take away from this example is that you can use extension methods to overload existing methods of a type.&lt;/p&gt;
&lt;p&gt;The &lt;font face="Courier New" size="2"&gt;Print&lt;/font&gt; extension method is shown below:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f3fd6ee0-5e77-402b-9df2-5f142e46d4da" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#EBEBEB;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; This class contains our Array List Extensions&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; ArrayListExtensions
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;        ....
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This extension method prints out the content of the Array
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;param name=&amp;quot;array&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Print(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt; ArrayList array)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Array Contents&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; i &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;; i &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; array.Count; i&lt;/span&gt;&lt;span style="color:#000000;"&gt;++&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;                Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\tIndex: {0}\tValue: {1}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, i, array&lt;img src="http://footheory.com/emoticons/emotion-55.gif" alt="Idea" /&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method Print&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }&lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; class ArrayListExtensions
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;A usage code sample is shown below (all of these examples are contained in the &lt;font face="Courier New" size="2"&gt;ExtendBCL&lt;/font&gt; project of the &lt;a href="http://footheory.com/files/folders/csharpandlinq/entry152.aspx" target="_blank"&gt;download code&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:71eb140c-26ac-4ba3-b5eb-6b3374423256" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E9E9E9;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Main(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] args)
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Create the array list, and use the &amp;quot;standard&amp;quot;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method to insert a single element&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            ArrayList list &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; ArrayList();
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;            list.Insert(&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;101&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Now, use the extension method to insert a whole range
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; of values&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            list.Insert(&lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;20&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;30&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;40&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;50&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;            
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Finally, use the Print extension method to 
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; print the content of the Array&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            list.Print();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;        
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method Main&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The above code invokes both the overloaded &lt;font face="Courier New" size="2"&gt;Insert&lt;/font&gt; method and the &lt;font face="Courier New" size="2"&gt;Print&lt;/font&gt; Extension method.&lt;/p&gt;
&lt;p&gt;The output of this method is shown below:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:136c1aea-d990-4359-a269-f43fc05a4e2e" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E4E4E4;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Array Contents
        Index: &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;        Value: &lt;/span&gt;&lt;span style="color:#000000;"&gt;101&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        Index: &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;        Value: &lt;/span&gt;&lt;span style="color:#000000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        Index: &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;        Value: &lt;/span&gt;&lt;span style="color:#000000;"&gt;20&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        Index: &lt;/span&gt;&lt;span style="color:#000000;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt;        Value: &lt;/span&gt;&lt;span style="color:#000000;"&gt;30&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        Index: &lt;/span&gt;&lt;span style="color:#000000;"&gt;4&lt;/span&gt;&lt;span style="color:#000000;"&gt;        Value: &lt;/span&gt;&lt;span style="color:#000000;"&gt;40&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        Index: &lt;/span&gt;&lt;span style="color:#000000;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;        Value: &lt;/span&gt;&lt;span style="color:#000000;"&gt;50&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Note that our above example covered a non-generic collection type, but of course extension method can be applied to any type, including collection classes from the &lt;font face="Courier New" size="2"&gt;System.Collections.Generics&lt;/font&gt; namespace.&lt;/p&gt;
&lt;h5&gt;&lt;/h5&gt;
&lt;h4&gt;Example 3: Extending and Interface&lt;/h4&gt;
&lt;p&gt;You can also create extension methods for interface, be it your own interfaces, our BCL interface. For&amp;nbsp; example, below is a very simple extension method for &lt;font face="Courier New" size="2"&gt;IEnumerable&amp;lt;T&amp;gt;.&lt;/font&gt; The method returns the actual value from &lt;font face="Courier New" size="2"&gt;MoveNext()&lt;/font&gt; and is called &lt;font face="Courier New" size="2"&gt;MoveToNextElement():&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:5aada49a-9e98-4305-8e44-d72670d83305" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E4E4E4;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This class provides a simple extension method for &amp;quot;IEnumerator&lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;T&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;quot;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; IEnumeratorExtension
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This is a simple extension method that moves to the next
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; element of the enumerator, and returns the real value
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; instead of a boolean 
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;typeparam name=&amp;quot;T&amp;quot;&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;param name=&amp;quot;enumerator&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; T MoveToNextElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt; IEnumerator&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;T&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; enumerator)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Initialize our return value&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            T nextElement &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;default&lt;/span&gt;&lt;span style="color:#000000;"&gt;(T);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;            T currentElement &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; enumerator.Current;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;            
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Try to move to the next element&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (enumerator.MoveNext())
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#000000;"&gt;                nextElement &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; enumerator.Current;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;                nextElement &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; currentElement;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; nextElement;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;31&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;32&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method MoveToNextElement&amp;lt;T&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;33&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Below is a small usage example:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:70fcc1bd-77f4-47c7-a585-028e7dab3dd1" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E4E4E4;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Main(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] args)
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;            List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; myInts &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;{ &lt;/span&gt;&lt;span style="color:#000000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;20&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;30&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;40&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;50&lt;/span&gt;&lt;span style="color:#000000;"&gt; };
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;  Get an enumerator for &amp;quot;myInts&amp;quot;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            IEnumerator&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; enumerator &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; myInts.GetEnumerator();
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(enumerator.MoveToNextElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;());
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(enumerator.MoveToNextElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;());
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(enumerator.MoveToNextElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;());
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(enumerator.MoveToNextElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;());
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The output of this sample is shown below:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:41224a14-2688-43a1-a909-f844b01a2620" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;width:128px;padding-top:0px;"&gt;&lt;pre style="background-color:#D8D8D8;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;20&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;30&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;40&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The above example also illustrates that extensions methods can be applied to generic types as well as "standard" types. The code for this section can be downloaded from the &lt;font face="Courier New" size="2"&gt;ExtendInterface&lt;/font&gt; project of the &lt;a href="http://footheory.com/files/folders/csharpandlinq/entry152.aspx" target="_blank"&gt;download code&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Extension method restrictions&lt;/h3&gt;
&lt;p&gt;The only restriction on extension methods is that&amp;nbsp;they cannot be used to extend a static class, such as &lt;font face="Courier New" size="2"&gt;System.Math&lt;/font&gt;. This makes sense, since a static class cannot be represented by&amp;nbsp;a "this" reference. For example, is you would try to write an extension method for the static &lt;font face="Courier New" size="2"&gt;System.Math&lt;/font&gt; class as shown below:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:06005c1c-59ae-470e-9dd9-48c9ab9a763f" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E1E1E1;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; MathExtension
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;3&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; SumInits(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt; Math math, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; value1, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; value2)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;4&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;5&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; value1 &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; value2;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;7&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You would get the following compilation error:&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:47ec43a7-5277-4e57-835f-e6f44db95967" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#FFBBBB;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Error    &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;System.Math&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;: &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; types cannot be used &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;as&lt;/span&gt;&lt;span style="color:#000000;"&gt; parameters    InvalidExtensionMethod&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;This is illustrated in the InvalidExtensionMethod project of the &lt;a href="http://footheory.com/files/folders/csharpandlinq/entry152.aspx" target="_blank"&gt;download solution&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Intellisense support for Extension Methods&lt;/h3&gt;
&lt;p&gt;Beta2 of Orcas has very nice support for extension method. The extension method is listed as a method of the type, but is adorned with a special icon, and the tooltip includes the fact that it is an extension method, as is shown below:&lt;/p&gt;
&lt;p&gt;&lt;a title="Intel99" href="http://www.flickr.com/photos/99548241@N00/1056741718/"&gt;&lt;img alt="Intel99" src="http://static.flickr.com/1110/1056741718_33457ff742_b.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Note the small blue "down arrow" icon which indicates an extension method. Also, the tooltip clearly indicates that this method is an extension method by pre-fixing the signature with the&lt;font face="Courier New" size="2"&gt; (extension)&lt;/font&gt; keyword.&lt;/p&gt;
&lt;h4&gt;&lt;/h4&gt;
&lt;h3&gt;Usage of Extension Methods in LINQ&lt;/h3&gt;
&lt;p&gt;All LINQ operators, such as &lt;font face="Courier New" size="2"&gt;from, where, select&lt;/font&gt; etc. are implemented using extension methods. For example, the &lt;font face="Courier" size="2"&gt;where&lt;/font&gt; clause checks for a boolean result of a test (e.g: Bre&lt;font face="Courier New" size="2"&gt;ed == "Great Dane") &lt;font face="tah"&gt;are implemented as extension methods. We will have more to say about this when we discuss lambda expressions.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:2bbbe029-8833-4619-b3f8-ccd787325137" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/LINQ" rel="tag"&gt;LINQ&lt;/a&gt;, &lt;a href="http://technorati.com/tags/C#%203.0" rel="tag"&gt;C# 3.0&lt;/a&gt;, &lt;a href="http://technorati.com/tags/Extension%20Methods" rel="tag"&gt;Extension Methods&lt;/a&gt;&lt;/div&gt;&lt;img src="http://footheory.com/aggbug.aspx?PostID=150" width="1" height="1"&gt;</content><author><name>bennie</name><uri>http://footheory.com/members/bennie.aspx</uri></author></entry><entry><title>New Features in C# 3.0, Part 3: Automatic Properties, Object Initializers and Collection Initializers</title><link rel="alternate" type="text/html" href="http://footheory.com/blogs/bennie/archive/2007/08/02/new-features-in-c-3-0-part-3-automatic-properties-object-initializers-and-collection-initializers.aspx" /><id>http://footheory.com/blogs/bennie/archive/2007/08/02/new-features-in-c-3-0-part-3-automatic-properties-object-initializers-and-collection-initializers.aspx</id><published>2007-08-03T06:05:43Z</published><updated>2007-08-03T06:05:43Z</updated><content type="html">&lt;h3&gt;Introduction&lt;/h3&gt; &lt;p&gt;This post does not focus on one particular new feature is the rich new feature set of&amp;nbsp; C# 3.0, but rather studies a set of features, which are loosely related, and play a roll in the enablement of LINQ in the .NET 3.5 framework, which is ultimately the focus of this series of posts.&lt;/p&gt; &lt;p&gt;In this post, we will study the following topics:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Automatic properties.&lt;/strong&gt; Automatic properties allow you to declare class properties using a very terse syntax, increasing&amp;nbsp;your productivity and reducing the amount of&amp;nbsp; typing that&amp;nbsp; you have to do.  &lt;li&gt;&lt;strong&gt;Object Initializers&lt;/strong&gt;. Object initializers allow you to use a focused, "short hand" notation to initialize the properties of a class.  &lt;li&gt;&lt;strong&gt;Collection Initializers&lt;/strong&gt;. Like object Initializers allow you to use a "short hand" syntax for the initialization of a class, collection initializers allow you to do the same thing for your collections.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Previous posts is this series are:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://footheory.com/blogs/bennie/archive/2007/07/29/new-features-in-c-3-0-part-1.aspx" target="_blank"&gt;New features in C# 3.0, Part 1.&lt;/a&gt; This part focuses on implicitly typed local variables  &lt;li&gt;&lt;a href="http://footheory.com/blogs/bennie/archive/2007/07/30/new-features-in-c-3-0-part-2.aspx" target="_blank"&gt;New Features in C# 3.0 Part 2.&lt;/a&gt; This post provides some insights into anonymous types.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The code for this feature can be downloaded &lt;a href="http://footheory.com/files/folders/csharpandlinq/entry148.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Ok enough talk, let's have a look at our first "feature of the day": Automatic Properties!&lt;/p&gt; &lt;h3&gt;Automatic Properties&lt;/h3&gt; &lt;h4&gt;Overview&lt;/h4&gt; &lt;p&gt;Note: the code for this feature is contained in the "AutomaticProperties" console application of the &lt;a href="http://footheory.com/files/folders/csharpandlinq/entry148.aspx" target="_blank"&gt;code&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&amp;nbsp;Everybody has written typical "data container" classes before. These are the typical classes which contains simple fields, and properties with both a getter and a setter for each fields. And every develop I know simply HATES writing these things, because they are what I call "monkey code", code that could be written by semi-intelligent primates (or even a project&amp;nbsp;manager ;-). &lt;/p&gt; &lt;p&gt;Below&amp;nbsp;are some&amp;nbsp;simple examples&amp;nbsp;of such&amp;nbsp;classes:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:8a3c1544-aacc-4860-92e9-1aac689aca68" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E6E6E6;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; AutomaticProperties.Classic
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This is our &amp;quot;classic, old style&amp;quot; CoffeeShop class
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; CoffeeShop
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; _shopName;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; Address _address;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;decimal&lt;/span&gt;&lt;span style="color:#000000;"&gt; _priceOfLatte;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; _baristaName;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; ShopName
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; _shopName;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;                _shopName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Address Address
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; _address;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;31&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;32&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;33&lt;/span&gt; &lt;span style="color:#000000;"&gt;                _address &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;34&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;35&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;36&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;37&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Decimal PriceOfLatte
&lt;/span&gt;&lt;span style="color:#008080;"&gt;38&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;39&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;40&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;41&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; _priceOfLatte;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;42&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;43&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;44&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;45&lt;/span&gt; &lt;span style="color:#000000;"&gt;                _priceOfLatte &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;46&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;47&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;48&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;49&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; BaristaName
&lt;/span&gt;&lt;span style="color:#008080;"&gt;50&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;51&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;52&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;53&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; _baristaName;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;54&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;55&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;56&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;57&lt;/span&gt; &lt;span style="color:#000000;"&gt;                _baristaName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;58&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;59&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;60&lt;/span&gt; &lt;span style="color:#000000;"&gt;    } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; class AutomaticProperties.Classic.CoffeeShop&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;61&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
&lt;/span&gt;&lt;span style="color:#008080;"&gt;62&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:3ce1aa58-ab3a-4505-bbcf-7d30fa7ef9bd" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#EEEEEE;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; AutomaticProperties.Classic
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; This is our &amp;quot;classic, old style&amp;quot; Address class
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Address
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; _streetName;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; _streetNumber;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; _city;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; _state;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; _zipCode;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; StreetName
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; _streetName;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;                _streetName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; StreetNumber
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; _streetNumber;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;31&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;32&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;33&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;34&lt;/span&gt; &lt;span style="color:#000000;"&gt;                _streetNumber &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;35&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;36&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;37&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;38&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; City
&lt;/span&gt;&lt;span style="color:#008080;"&gt;39&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;40&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;41&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;42&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; _city;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;43&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;44&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;45&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;46&lt;/span&gt; &lt;span style="color:#000000;"&gt;                _city &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;47&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;48&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;49&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;50&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; State
&lt;/span&gt;&lt;span style="color:#008080;"&gt;51&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;52&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;53&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;54&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; _state;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;55&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;56&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;57&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;58&lt;/span&gt; &lt;span style="color:#000000;"&gt;                _state &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;59&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;60&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;61&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;62&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; ZipCode
&lt;/span&gt;&lt;span style="color:#008080;"&gt;63&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;64&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;65&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;66&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; _zipCode;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;67&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;68&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;69&lt;/span&gt; &lt;span style="color:#000000;"&gt;            {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;70&lt;/span&gt; &lt;span style="color:#000000;"&gt;                _zipCode &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;71&lt;/span&gt; &lt;span style="color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;72&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;73&lt;/span&gt; &lt;span style="color:#000000;"&gt;    } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; class AutomaticProperties.Classic.Address
&lt;/span&gt;&lt;span style="color:#008080;"&gt;74&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The code above defines two classes, both of which are in the &lt;font face="Courier New" size="2"&gt;AutomaticProperties.Classic&lt;/font&gt; namespace:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;CoffeeShop&lt;/font&gt; 
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;Address&lt;/font&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Automatic properties allow you to avoid having to manually declare a private field and write the get/set logic -- instead the compiler will automatically creating the private field and the default get/set operations for you.&amp;nbsp; Below are the &lt;font face="Courier New" size="2"&gt;CoffeeShop&lt;/font&gt; and &lt;font face="Courier New" size="2"&gt;Address&lt;/font&gt; classes rewritten using Automatic Properties (note that both classes are in the &lt;font face="Courier New" size="2"&gt;AutomaticProperties.New&lt;/font&gt; namespace):&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f5642939-1a8e-4570-9af4-ae04ee5b3c40" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#EAEAEA;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; CoffeeShop
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;3&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; ShopName { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;4&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Address Address { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;5&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;decimal&lt;/span&gt;&lt;span style="color:#000000;"&gt; PriceOfLatte { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; BaristaName { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;7&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:5fa3c3dc-2368-426d-bba0-b5f7a516c55b" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;width:384px;padding-top:0px;"&gt;&lt;pre style="background-color:#EEEEEE;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Address
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;3&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; StreetName { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;4&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; StreetNumber { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;5&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; City { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; State { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;7&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; ZipCode { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;8&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;That's it. Note that we went from 100+ lines of code to a grand total of 15! &lt;/p&gt;
&lt;p&gt;When the C# 3.0 compiler encounters an empty get/set property implementation like we created above in the &lt;font face="Courier New" size="2"&gt;CoffeeShop&lt;/font&gt; and &lt;font face="Courier New" size="2"&gt;Address&lt;/font&gt; classes, it will now automatically generate a private field for us within&amp;nbsp;our class, and implement a public getter and setter property implementation for it.&amp;nbsp;&amp;nbsp;The benefit of this is that from a type-contract perspective, the class looks exactly like it did with my first (much more verbose) implementation shown above.&amp;nbsp; This means that -- unlike resorting to public fields -- I can in the future add validation logic within my property setter implementation without having to change any external component that references my class.&lt;/p&gt;
&lt;h4&gt;Usage Example&lt;/h4&gt;
&lt;p&gt;Now, using "classic" classes, and classes that use automatic properties is completely identical. To provide this, I have included a small piece of client code in the &lt;a href="http://footheory.com/files/folders/csharpandlinq/entry148.aspx" target="_blank"&gt;download file,&lt;/a&gt; that looks as follows:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:b57c70eb-9cc0-43ed-a260-2763d83b69b4" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#EEEEEE;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Comment out one of the using statements below
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; to either use the &amp;quot;Classic&amp;quot; or the &amp;quot;New-Style&amp;quot;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Automatic Properties-style classes&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; AutomaticProperties.Classic; &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; uses class classes
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;using AutomaticProperties.New;   &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; uses automatic properties &lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; AutomaticProperties
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Program
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Main(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] args)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Address address &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Address();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;            address.StreetNumber &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;50&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;            address.StreetName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Passover Lane&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;            address.ZipCode &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;6703&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;            address.State &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;MO&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;            address.City &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Missoula&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#000000;"&gt;            CoffeeShop coffeeShop &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; CoffeeShop();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#000000;"&gt;            coffeeShop.Address &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; address;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#000000;"&gt;            coffeeShop.PriceOfLatte &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;3.95M&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;            coffeeShop.ShopName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;It's a Grind!&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;            coffeeShop.BaristaName &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;6 Shot Lucie&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="color:#000000;"&gt;}
&lt;/span&gt;&lt;span style="color:#008080;"&gt;31&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You can comment out either the "using &lt;font face="Courier New" size="2"&gt;AutomaticProperties.Classic"&lt;/font&gt; or the "&lt;font face="Courier New" size="2"&gt;AutomaticProperties.New"&lt;/font&gt; line, and depending on which "using" line is not commented out, the code will use&amp;nbsp; the classic classes, or the classes with the automatic properties. Note though that the rest of code is unchanged.&lt;/p&gt;
&lt;p&gt;There is one interesting thing to try though. If you use the "classic" objects, and you set a breakpoint on a line that sets a property, for example:&lt;/p&gt;
&lt;p&gt;&lt;a title="MainBreakPoint" href="http://www.flickr.com/photos/99548241@N00/993805748/"&gt;&lt;img alt="MainBreakPoint" src="http://static.flickr.com/1040/993805748_df43a4f5ba.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;and you "Step In" (F11), then you will actually go to the setter of the property implementation, as shown below:&lt;/p&gt;
&lt;p&gt;&lt;a title="StreetNumberBreak" href="http://www.flickr.com/photos/99548241@N00/992976973/"&gt;&lt;img alt="StreetNumberBreak" src="http://static.flickr.com/1046/992976973_48fa3401f8.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;this makes sense, since we provided this setter in C#!&lt;/p&gt;
&lt;h4&gt;Automatic Properties in detail&lt;/h4&gt;
&lt;p&gt;Now, when you switch to the "automatic properties" version of the objects, and you set the same breakpoint and you step in, you notice that nothing actually happens, which makes sense, because there is only direct IL code, generated by the compiler behind the setter implementation, and no C# code, so the compiler has nowhere to go!&lt;/p&gt;
&lt;p&gt;The easiest way to verify this is to bring out our old friend &lt;font face="Courier New" size="2"&gt;ILDASM.exe,&lt;/font&gt; and open&amp;nbsp;our "automatic properties" version&amp;nbsp;&lt;font face="Courier New" size="2"&gt;Address&lt;/font&gt; class is this tool. It would look something like this:&lt;/p&gt;
&lt;p&gt;&lt;a title="ILDASM_Address" href="http://www.flickr.com/photos/99548241@N00/993032135/"&gt;&lt;img alt="ILDASM_Address" src="http://static.flickr.com/1051/993032135_4fbdee7829.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;now, we can compare this to the "classic" style &lt;font face="Courier New" size="2"&gt;Address&lt;/font&gt; class:&lt;/p&gt;
&lt;p&gt;&lt;a title="ILDASM_ADDRESS_Classic" href="http://www.flickr.com/photos/99548241@N00/993904856/"&gt;&lt;img alt="ILDASM_ADDRESS_Classic" src="http://static.flickr.com/1292/993904856_50cdb46904.jpg" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The we notice that on the surface things very much look the same. Both classes have their properties, and their getters and setters. BUT the big difference is the the "classic" version has the actual fields as we defined them, while for the "automatic properties" version,the compiler injected&amp;nbsp; a private member variable, prefixed with &lt;font face="Courier New" size="2"&gt;&amp;lt;k&amp;gt;BackingField,&lt;/font&gt; like this one for the City property:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:c4512a7d-e8f9-42d8-8bd4-3c2fd833621e" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E9E9E9;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;.field &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;City&amp;gt;k__BackingField&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#000000;"&gt;.custom instance &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ( &lt;/span&gt;&lt;span style="color:#000000;"&gt;01&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;00&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;00&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;00&lt;/span&gt;&lt;span style="color:#000000;"&gt; ) &lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The &lt;font face="Courier New" size="2"&gt;CompilerGeneratedAttribute&lt;/font&gt; is useful if you have a tool that would like to find out if something is auto-generated. The getter IL implementation look like this:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:42820059-9949-4619-b4cf-22c32df4fa15" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E8E8E8;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;.method &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; hidebysig specialname instance &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;        get_City() cil managed
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;  .custom instance &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ( &lt;/span&gt;&lt;span style="color:#000000;"&gt;01&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;00&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;00&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;00&lt;/span&gt;&lt;span style="color:#000000;"&gt; ) 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;  &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Code size       11 (0xb)&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;  .maxstack  &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;  .locals init (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; V_0)
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0000:  ldarg.&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0001:  ldfld      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; AutomaticProperties.New.Address::&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;City&amp;gt;k__BackingField&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0006:  stloc.&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0007:  br.s       IL_0009
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0009:  ldloc.&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_000a:  ret
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;} &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; end of method Address::get_City&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note the reference to the backing field in line 9. The setter IL looks very similar:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:3e3cec0e-7537-491b-9dc7-feae8b661f67" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#EAEAEA;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;.method &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; hidebysig specialname instance &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;        set_City(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;value&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;) cil managed
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;  .custom instance &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ( &lt;/span&gt;&lt;span style="color:#000000;"&gt;01&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;00&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;00&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;00&lt;/span&gt;&lt;span style="color:#000000;"&gt; ) 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;  &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Code size       8 (0x8)&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;  .maxstack  &lt;/span&gt;&lt;span style="color:#000000;"&gt;8&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0000:  ldarg.&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0001:  ldarg.&lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0002:  stfld      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; AutomaticProperties.New.Address::&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;City&amp;gt;k__BackingField&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0007:  ret
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;} &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; end of method Address::set_City&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Again note the setting of the backing field at line 9. So, as you can see, the "automatic property" version of the code has NO C# code behind the getters and setters of the properties, which is why we could not step into the code with the debugger.&lt;/p&gt;
&lt;p&gt;One last important note: Automatic properties should have both a getter and a setter. If you leave out one of the two, you will get a compiler error like this:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:0e809bbf-b81f-4cce-9cec-3f288f12a869" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#FFD2D2;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Error    &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;AutomaticProperties.New.Address.City.get&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt; must declare a body because it &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;is&lt;/span&gt;&lt;span style="color:#000000;"&gt; not marked &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;abstract&lt;/span&gt;&lt;span style="color:#000000;"&gt; or &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;extern&lt;/span&gt;&lt;span style="color:#000000;"&gt;. 
Automatically implemented properties must define both &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; and &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; accessors.    
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;When you think about it&amp;nbsp;this&amp;nbsp;really makes sense, the whole concept behind automatic properties is to allow you to quickly write typical "data container" or "property&amp;nbsp;bag"&amp;nbsp;classes, which typically have read/write properties.&lt;/p&gt;
&lt;h3&gt;Object Initializers&lt;/h3&gt;
&lt;h4&gt;Overview&lt;/h4&gt;
&lt;p&gt;Note: the code for this feature is contained in the "ObjectInitializers" console application of the &lt;a href="http://footheory.com/files/folders/csharpandlinq/entry148.aspx" target="_blank"&gt;code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;When we write code that deals with simple objects, we tend to rely heavily on the use of properties. The sample code for this section contains a class named "&lt;font face="Courier New" size="2"&gt;CarModel&lt;/font&gt;" which represents the model of a car. The class is shown below:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f4cb800f-bd51-4c59-a548-25ced8dc295a" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E5E5E5;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; CarModel
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; _make;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; _model;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; _year;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Make
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; _make; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; { _make &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Model
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; _model; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; { _model &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; Year
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; _year; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt; { _year &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; value; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; ToString()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; String.Format(
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Make: {0}, Model: {1}, Year: {2} &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Make, Model, Year);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;31&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;In a typical approach, we would initialize a new instance of this class as follows:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:eb71fb1c-d6e3-43ae-af20-52d95e6dbd3d" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#EAEAEA;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; CreateCarModelTraditional()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;3&lt;/span&gt; &lt;span style="color:#000000;"&gt;            CarModel carModel &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; CarModel();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;4&lt;/span&gt; &lt;span style="color:#000000;"&gt;            carModel.Make &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Acura&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;5&lt;/span&gt; &lt;span style="color:#000000;"&gt;            carModel.Model &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TL&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;6&lt;/span&gt; &lt;span style="color:#000000;"&gt;            carModel.Year &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;2007&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;7&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Traditional CarModel: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; carModel);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;8&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;9&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method CreateCarModelTraditional&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;While this is a tried-and-true approach that has served us well for many years, it is very verbose. C# 3.0 now offers a new feature called "Object Initializers", which allows us to write the above code as follows:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:dd1334d4-eb0b-46ad-b150-270094a3f701" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#F2F2F2;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; CreateCarModelWithInitializer()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;3&lt;/span&gt; &lt;span style="color:#000000;"&gt;            CarModel carModel &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; CarModel {Make &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Acura&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Model &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TL&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Year &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;2007&lt;/span&gt;&lt;span style="color:#000000;"&gt;};
&lt;/span&gt;&lt;span style="color:#008080;"&gt;4&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\nCarModel with Initializer: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; carModel);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;5&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method CreateCarModelWithInitializer&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;All this is is really "Syntactic Sugar", which at the IL level results in the same code as the tradition approach. Indeed, the compiler will automatically generate all of the property-setter code, which has exactly the same implementation as our&amp;nbsp;first, more verbose example&amp;nbsp;(more in on this in our "In-Depth" section).&lt;/p&gt;
&lt;p&gt;Note that Object Initializers will also work with more&amp;nbsp;complex objects, which have nested sub-objects. For example, below is the code for a "&lt;font face="Courier New" size="2"&gt;Car&lt;/font&gt;" class, which contains an embedded "&lt;font face="Courier New" size="2"&gt;CarModel&lt;/font&gt;" instance:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:b69cf1e2-24a7-4677-9ca7-31adb6252535" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E5E5E5;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Car
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; CarModel CarModel { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; EngineCC { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; HoursePower { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Color { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; ToString()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; String.Format(
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Make: {0}, Model: {1}, Year: {2}, \n\tEngineCC: {3}, HorsePower: {4}, Color: {5}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;                CarModel.Make, CarModel.Model, CarModel.Year, EngineCC, HoursePower, Color);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Note that is this case, I used the more compact "Automatic Properties" approach described in the first part of this post . Indeed Object Initializers work directly with the property setters, so they don't know or care that you used the traditional approach, or the "Automatic Properties" approach to create your properties.&lt;/p&gt;
&lt;p&gt;Below is an example of an object initializer for a Car instance:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:03cfe8db-6ecf-4e3b-ae83-5b446cc5247f" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#EBEBEB;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; createCompoundObject()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;  Create a Car instance with an initializer&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            Car car &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Car { 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;                            Color &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;White&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;                            HoursePower &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;320&lt;/span&gt;&lt;span style="color:#000000;"&gt;, 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;                            EngineCC &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;3600&lt;/span&gt;&lt;span style="color:#000000;"&gt;, 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;                            CarModel &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; CarModel {Make &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Acura&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Model &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TL Type S&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Year &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;2007&lt;/span&gt;&lt;span style="color:#000000;"&gt;}};
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\nComplete Car With Initializer: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; car &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; Environment.NewLine);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;        
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method createCompoundObject&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In line 8, you can see how we embedded the initializer for the &lt;font face="Courier New" size="2"&gt;CarModel&lt;/font&gt; directly into the initializer for the &lt;font face="Courier New" size="2"&gt;Car&lt;/font&gt; instance.&lt;/p&gt;
&lt;h4&gt;Object Initializers in depth&lt;/h4&gt;
&lt;p&gt;In this section, we&amp;nbsp; will look at the code that is generated by the compiler when we write an object initializer. For example, is we pull out ILDASM (yes, always have that one on your tool belt ;-), and look at the code for the method &lt;font face="Courier New" size="2"&gt;CreateCarModelWithInitializer(),&lt;/font&gt; we see the following:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:3a9ccaae-5bad-4fd2-b2c8-30b755c564ea" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E8E8E8;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;.method &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; hidebysig &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt;  CreateCarModelWithInitializer() cil managed
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;  &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Code size       63 (0x3f)&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;  .maxstack  &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;  .locals init ([&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; ObjectInitializers.CarModel carModel,
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;           [&lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; ObjectInitializers.CarModel &lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&amp;gt;g__initLocal0&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0000:  nop
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0001:  newobj     instance &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ObjectInitializers.CarModel::.ctor()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0006:  stloc.&lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0007:  ldloc.&lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0008:  ldstr      &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Acura&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_000d:  callvirt   instance &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ObjectInitializers.CarModel::set_Make(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0012:  nop
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0013:  ldloc.&lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0014:  ldstr      &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TL&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0019:  callvirt   instance &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ObjectInitializers.CarModel::set_Model(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_001e:  nop
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_001f:  ldloc.&lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0020:  ldc.i4     &lt;/span&gt;&lt;span style="color:#000000;"&gt;0x7d7&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0025:  callvirt   instance &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ObjectInitializers.CarModel::set_Year(int32)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_002a:  nop
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_002b:  ldloc.&lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_002c:  stloc.&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_002d:  ldstr      &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\nCarModel with Initializer: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0032:  ldloc.&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0033:  call       &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; [mscorlib]System.String::Concat(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;                                                              &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0038:  call       &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; [mscorlib]System.Console::WriteLine(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_003d:  nop
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_003e:  ret
&lt;/span&gt;&lt;span style="color:#008080;"&gt;31&lt;/span&gt; &lt;span style="color:#000000;"&gt;} &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; end of method Program::CreateCarModelWithInitializer
&lt;/span&gt;&lt;span style="color:#008080;"&gt;32&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Now, when we compare this code with the code for the &lt;font face="Courier New" size="2"&gt;CreateCarModeTraditional():&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:1d35eb20-ff07-4fca-a3e1-1385121e3645" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E2E2E2;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;.method &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; hidebysig &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt;  CreateCarModelTraditional() cil managed
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;  &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Code size       61 (0x3d)&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;  .maxstack  &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;  .locals init ([&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; ObjectInitializers.CarModel carModel)
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0000:  nop
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0001:  newobj     instance &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ObjectInitializers.CarModel::.ctor()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0006:  stloc.&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0007:  ldloc.&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0008:  ldstr      &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Acura&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_000d:  callvirt   instance &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ObjectInitializers.CarModel::set_Make(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0012:  nop
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0013:  ldloc.&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0014:  ldstr      &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TL&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0019:  callvirt   instance &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ObjectInitializers.CarModel::set_Model(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_001e:  nop
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_001f:  ldloc.&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0020:  ldc.i4     &lt;/span&gt;&lt;span style="color:#000000;"&gt;0x7d7&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0025:  callvirt   instance &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ObjectInitializers.CarModel::set_Year(int32)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_002a:  nop
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_002b:  ldstr      &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Traditional CarModel: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0030:  ldloc.&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0031:  call       &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; [mscorlib]System.String::Concat(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#000000;"&gt;                                                              &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_0036:  call       &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; [mscorlib]System.Console::WriteLine(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_003b:  nop
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;  IL_003c:  ret
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#000000;"&gt;} &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; end of method Program::CreateCarModelTraditional
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;We note the the ONLY difference between the generated IL is the following:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:fd75b15f-1097-429f-8c01-ed3a43d6aeb7" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E5E5E5;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;  .locals init ([&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; ObjectInitializers.CarModel carModel,
           [&lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; ObjectInitializers.CarModel &lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&amp;gt;g__initLocal0&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The second line in this code block is some bookkeeping for the compiler to remember that&amp;nbsp; Object Initializers were used for this code, but for the rest the code is identical, and the total size of the the general IL is almost the same (61 and 63 bytes), so there is really no overhead in using object initializers.&lt;/p&gt;
&lt;p&gt;One case where you need to pay a bit of attention is if you have any object that has a non-default constructor, as show in the example below:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:a34ddde7-2304-46a8-840a-e9c212607f38" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E4E4E4;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Engine
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; Horsepower { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; CC { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Engine(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; horsePower)
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Horsepower &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; horsePower;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;    } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; class Engine
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you would attempt to use an object initializer in this scenario like this, you will run into some problems:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:b8134162-4ca5-4396-8aeb-62d40f7308a7" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E4E4E4;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; objectWithCtorExample()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;3&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Engine engine &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Engine { Horsepower &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;120&lt;/span&gt;&lt;span style="color:#000000;"&gt;, CC &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;2600&lt;/span&gt;&lt;span style="color:#000000;"&gt; };
&lt;/span&gt;&lt;span style="color:#008080;"&gt;4&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Indeed, you will get the following compilation error:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:e56eb05a-1197-40bb-8682-47395dc3923c" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#FFB0B0;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;
Error    &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;ObjectInitializers.Engine&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt; does not contain a constructor that takes &lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;span style="color:#000000;"&gt; arguments

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You have two solutions for this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add a default constructor to your class (in all&amp;nbsp; of our previous examples, this default constructor was automatically written for us by the compiler). 
&lt;li&gt;Use a syntax that uses the constructor, and uses an object initializer for the remaining properties, as is show below:&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:0f8ce7de-1057-4846-ba7f-fd4b9c68cc2a" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E4E4E4;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; objectWithCtorExample()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;3&lt;/span&gt; &lt;span style="color:#000000;"&gt;            Engine engine &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Engine(&lt;/span&gt;&lt;span style="color:#000000;"&gt;120&lt;/span&gt;&lt;span style="color:#000000;"&gt;) { CC &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;2600&lt;/span&gt;&lt;span style="color:#000000;"&gt; };
&lt;/span&gt;&lt;span style="color:#008080;"&gt;4&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;SO, the above code is a bit of a "hybrid" (to use a popular expression -) between the use of constructors and object initializers.&lt;/p&gt;
&lt;h3&gt;Collection Initializers&lt;/h3&gt;
&lt;h4&gt;Overview&lt;/h4&gt;
&lt;p&gt;Note: the code for this feature is contained in the "CollectionInitializers" console application of the &lt;a href="http://footheory.com/files/folders/csharpandlinq/entry148.aspx" target="_blank"&gt;code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The concept of Object Initializers can be expanded to collections with C# 3.0. Using a new feature, called "Collection Initializers" you an use a compact syntax to initialize a collection.&lt;/p&gt;
&lt;p&gt;For example, take the following class:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:0f59df86-32d2-4a0c-8ed8-4df68a45f2b2" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#DFDFDF;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Dog
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Breed { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; HairColor { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; Weight { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt; IsFriendly { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; ToString()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; String.Format(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\tDog: Breed: {0}, HairColor: {1}, Weight : {2}, IsFriendly: {3}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;                Breed, HairColor, Weight, IsFriendly);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;    } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; class Dog&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;in a traditional approach, you could create a collection of dogs as follows:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:d58c24dd-72c3-4df7-b98e-760e0ab7f928" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E6E6E6;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; createDogListTraditional()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;3&lt;/span&gt; &lt;span style="color:#000000;"&gt;            List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Dog&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; dogs &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Dog&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;4&lt;/span&gt; &lt;span style="color:#000000;"&gt;            dogs.Add(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Dog {Breed &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Great Dane&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, HairColor &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Fawn&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Weight &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;165&lt;/span&gt;&lt;span style="color:#000000;"&gt;, IsFriendly &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;});
&lt;/span&gt;&lt;span style="color:#008080;"&gt;5&lt;/span&gt; &lt;span style="color:#000000;"&gt;            dogs.Add(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Dog { Breed &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Mud&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, HairColor &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;DirtyBlack&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Weight &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;15&lt;/span&gt;&lt;span style="color:#000000;"&gt;, IsFriendly &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt; });
&lt;/span&gt;&lt;span style="color:#008080;"&gt;6&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;7&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method createDogListTraditional
&lt;/span&gt;&lt;span style="color:#008080;"&gt;8&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;So, here we do what we always do, we create a collection, and then add new instances to the collection. The approach with a collection initializer results in more compact code, as is shown below:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:2976a1f8-d805-4736-b0fe-3c97d954434b" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:#E8E8E8;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; createDogListCollectionInitializer()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;2&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;3&lt;/span&gt; &lt;span style="color:#000000;"&gt;            List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Dog&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; dogs &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Dog&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;() {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;4&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Dog { Breed &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Great Dane&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, HairColor &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Fawn&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Weight &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;165&lt;/span&gt;&lt;span style="color:#000000;"&gt;, IsFriendly &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt; },
&lt;/span&gt;&lt;span style="color:#008080;"&gt;5&lt;/span&gt; &lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Dog { Breed &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Mud&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, HairColor &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;DirtyBlack&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Weight &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;15&lt;/span&gt;&lt;span style="color:#000000;"&gt;, IsFriendly &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;6&lt;/span&gt; &lt;span style="color:#000000;"&gt;            };
&lt;/span&gt;&lt;span style="color:#008080;"&gt;7&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;8&lt;/span&gt; &lt;span style="color:#000000;"&gt;        } &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; method createDogListCollectionInitializer
&lt;/span&gt;&lt;span style="color:#008080;"&gt;9&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;So, we no longer need the "dogs.Add", statements, and our code looks more natural and compact. 
&lt;p&gt;&lt;/p&gt;
&lt;h4&gt;Collection Initializers in depth&lt;/h4&gt;
&lt;p&gt;I looked at the generated IL code in ILDASM, and the code sizes for each of the methods was as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;CreateDogListTraditional():&lt;/font&gt; 128 bytes 
&lt;li&gt;&lt;font face="Courier New" size="2"&gt;CreateDogListCollectionInitializer():&lt;/font&gt; 130 bytes&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;So again, there is no noticeable overhead in using collection initializers in your code, and I would greatly recommend that you do so to improve the readability of your code.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;I hope this article provided you with a good overview of automatic properties, object initializers and collection initializers. These 3 features are used in every LINQ query, and are actually also very useful when you are writing regular production code.&lt;/p&gt;
&lt;p&gt;In our next post, we will look&amp;nbsp;at C# 3.0 lambda expressions, which go directly to the core of the how LINQ expressions are generated by the compiler.&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:e4efbc48-d0f2-4820-b052-a960a11fb70d" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/C#%203.0" rel="tag"&gt;C# 3.0&lt;/a&gt;, &lt;a href="http://technorati.com/tags/LINQ" rel="tag"&gt;LINQ&lt;/a&gt;&lt;/div&gt;&lt;img src="http://footheory.com/aggbug.aspx?PostID=143" width="1" height="1"&gt;</content><author><name>bennie</name><uri>http://footheory.com/members/bennie.aspx</uri></author><category term=".NET Framework" scheme="http://footheory.com/blogs/bennie/archive/tags/.NET+Framework/default.aspx" /><category term="C# 3.0" scheme="http://footheory.com/blogs/bennie/archive/tags/C_2300_+3.0/default.aspx" /><category term="LINQ" scheme="http://footheory.com/blogs/bennie/archive/tags/LINQ/default.aspx" /></entry></feed>